MySQL 整数类型:INT、BIGINT 及更多
MySQL 提供了多种整数类型。虽然在大多数场景下使用 INT 类型可能是正确的选择,但了解你的选项对数据库设计至关重要,以便做出最佳选择。在本文中,我们将深入探讨 MySQL 中的各种整数类型,并详细说明它们是如何存储的。
MySQL INT 类型概述
整数(Integer)就是一个完整的数字,可以是正数、负数,也可以是零。MySQL 中有几种不同的数据类型可以用来存储整数,每种类型都有其特定的数字范围。标准的 INT 类型可以存储最多 4,294,967,296 个值(包括 0),并且除非特别指定,MySQL 默认允许存储负数。定义一个 INT 列的语法如下所示:
CREATE TABLE my_table ( my_integer_col INT );
由于 MySQL 默认允许正数和负数,因此 my_integer_col
可以存储从 -2,147,483,648 到 2,147,483,647 的整数。这样的极其具体的数值可能让人感到奇怪,但这一切都与二进制如何工作以及数据库引擎如何存储数据密切相关。
MySQL INT 类型与二进制系统
现代世界大部分场景使用的是十进制(base-10)数字系统。这意味着单个数字的位置可用 10 个值(即 0-9)。当一个位置达到允许的最大值时,它会“进位”,并添加另一个位置来表示更大的值。
十进制示例(base-10)
8 9 10 * ← 进位 11 12
这个系统可能对你来说非常熟悉,毕竟你很早就开始学习十进制。然而,还有其他数字系统,二进制(binary)就是其中一种,也是计算机最常使用的数字系统。
二进制是一个基于 2 的数字系统。每个位置只有两个可能的值:0 或 1。无论可用值如何,只要该位置达到允许的最大值,它仍然会“进位”。这使得二进制看起来非常陌生。以下是二进制与十进制的进位对比:
二进制 (base-2) | 十进制 (base-10) |
0 | 0 |
1 | 1 |
10 * | 2 |
11 | 3 |
100 * | 4 |
101 | 5 |
110 * | 6 |
111 | 7 |
1000 * | 8 |
1001 | 9 |
1010 * | 10 * ← 进位 |
那么这一切与 MySQL 的整数有什么关系?INT 数据类型是一个**有符号的 32 位值**。“位置”被称为位(bit)。这意味着一个整数有 32 个二进制位置可以存放 0 或 1,最左边的位用于表示数字是正数还是负数。以下是 MySQL 内部对整数的表示:
32 位二进制: 00000000000000000000010001110101 十进制: 1141
不同的整数数据类型
除了 INT 类型外,MySQL 还支持其他四种整数类型。以下是这些整数类型及其大致范围的对比表:
类型 | 位长 (bits) | 最小值 (有符号) | 最大值 (有符号) |
BIGINT | 64 | -2^63 | 2^63 – 1 |
INT | 32 | -2,147,483,648 | 2,147,483,647 |
MEDIUMINT | 24 | -8,388,608 | 8,388,607 |
SMALLINT | 16 | -32,768 | 32,767 |
TINYINT | 8 | -128 | 127 |
注意 TINYINT 的范围是 -128 到 127。这是因为在有符号整数中,范围的上半部分包含了零。
有符号与无符号整数
在二进制部分提到过,最左边的一位用来表示值是正数还是负数。MySQL 允许修改此行为,将该位包含到存储值中。这使得你可以在列中存储更大的正数,同时不允许存储负数。使用 UNSIGNED
关键词可以将所有值设置为正数:
CREATE TABLE my_table ( my_integer_col INT UNSIGNED );
以下是之前的整数类型表格更新后的版本,其中仅列出了无符号整数的最大值(最小值始终为 0):
类型 | 最大值 (无符号) |
BIGINT | 2^64 – 1 |
INT | 4,294,967,295 |
MEDIUMINT | 16,777,215 |
SMALLINT | 65,535 |
TINYINT | 255 |
关于整数宽度的一点注意事项
在本文开头,我们展示了如何定义一个 INT 列:
CREATE TABLE my_table ( my_integer_col INT );
你可能会遇到定义为 INT(5)
的整数列,其中的数字 5
表示列的宽度。如果你熟悉其他类型,比如 VARCHAR,你可能会认为这会影响允许的范围或存储在列中的字符数量,但整数类型并不是这样。宽度只与 ZEROFILL
关键字结合使用时才有意义,此时 MySQL 会自动左侧填充零来达到指定的宽度。
以下是不同定义对存储值和返回值的影响:
列定义 | 存储值 | 返回值 |
INT | 123 | 123 |
INT(5) | 123 | 123 |
INT(5) ZEROFILL | 123 | 00123 |
INT(5) ZEROFILL | 123456 | 123456 |
作为最佳实践,我建议避免以这种方式使用整数列,因为它只影响返回的数据显示方式,而这种逻辑最好由使用 MySQL 的应用程序来处理。
何时使用不同的整数类型
选择整数类型主要取决于以下两个问题:
- 你是否需要存储负数?如果答案是肯定的,你应该使用本文中描述的整数类型的有符号版本;否则,请选择无符号(UNSIGNED)版本,这样可以存储更大的数字。
- 你需要存储的数字有多大?由于每种整数类型都有硬性限制的最大值,这将帮助你定义 schema 时确定使用哪种类型。同时需要注意的是,较大的整数类型占用更多的磁盘空间,因此在选择数据类型时需有所权衡。
进一步学习
如果你想了解更多关于 MySQL 数据类型的信息,我们还有一些关于 JSON 数据类型和 VARCHAR 数据类型的文章,可能对你有帮助。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接