MySQL 支持 SQL 标准整数类型 INTEGER(或 INT)和 SMALLINT。作为标准的扩展,MySQL 还支持 TINYINT、MEDIUMINT 和 BIGINT 整数类型。下表显示了每种整数类型所需的存储空间和范围。

类型 存储 (Bytes) 最小值(有符号) 最小值(无符号) 最大值(有符号) 最大值(无符号)
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

这些整数类型后面的数字表示最大显示宽度,并不影响实际存储范围。例如,INT(5) 和 INT(11) 的存储范围和大小完全一样,都是 -2147483648 ~ 2147483647,占 4 个字节。(5) 和 (11) 只是表示显示宽度,即 INT(5) 显示结果的最大宽度为 5 位,不足会用空格(默认)补齐;INT(11) 显示结果的最大宽度为 11 位。

下面通过一个具体的例子来说明。

首先,创建一张名为 tbl_integer 的数据表,包含两列 id_5id_11,数据类型均为整数类型,最大显示宽度分别为 5 和 11,并都设置成无符号且填充零(UNSIGNED ZEROFILL),即当数值位数未达到设置的显示宽度时,会在数值前面填充零直到满足设定的显示宽度。其中 id_5 列是主键,表的存储引擎为 InnoDB,字符集为 utf8mb4。

表 DDL 如下:

1
2
3
4
5
CREATE TABLE `tbl_integer` (
`id_5` int(5) unsigned zerofill NOT NULL,
`id_11` int(11) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id_5`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

依次执行以下插入语句:
1
2
insert into tbl_integer values(12,12);
insert into tbl_integer values(123456,1234567890);

最后,执行以下查询语句:
1
select * from tbl_integer;

返回结果如下:
1
2
3
4
5
6
7
8
+--------+-------------+
| id_5 | id_11 |
+--------+-------------+
| 00012 | 00000000012 |
| 123456 | 01234567890 |
+--------+-------------+
2 rows in set (0.00 sec)


可以看到,如果数字的位数少于指定的显示宽度,MySQL 会使用 0 来填充左侧以保持显示宽度一致。如在列 id_5 中,数字 12 会显示为 00012。

注:上述示例是在 MySQL CLI(即命令行界面)进行操作,部分 MySQL 客户端工具可能会自动去掉整数前面的 0,查询出来的结果不会显示左边的 0。

另外需要注意的是,显示宽度并不影响实际存储大小和性能。INT(5) 和 INT(11) 占用存储空间完全相同,处理速度也一样。

小结

INT(5) 和 INT(11) 之间的唯一区别是显示宽度的设置。这些设置只影响结果的显示,在存储和计算上没有任何实际变化。记住,INT 类型的取值范围与显示宽度无关,仍然是 -2,147,483,648 到 2,147,483,647。在选择使用哪种显示宽度时,可以根据实际需要和美观度进行选择。

以上简单介绍了 MySQL 中 INT(5) 和 INT(11) 的区别,希望可以帮助大家更好地使用 MySQL 的整数类型。

参考资料:

  1. MySQL Documentation: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html

(END)