正如其他人所说,列可以存储的最小/最大值以及以字节为单位的存储量仅由类型而不是长度定义 .
很多这些答案都说 (11) 部分仅影响显示宽度,这不完全正确,但主要是 .
int(2) 与 no zerofill specified 的定义将:
仍然接受 100 的值
输出时
仍为 100 100 的值(不是 0 或 00 )
display width 将是从select查询输出的最大值的宽度 .
(2) 唯一能做的就是 if zerofill is also specified :
1 的值将显示 01 .
显示值时,该列将始终具有 width of the maximum possible value the column could take (整数的10位数),而不是显示该列需要在该特定选择查询中显示的最大值所需的最小宽度,这可能要小得多 .
该列仍然可以使用,并显示超过长度的值,但这些值不会以0为前缀 .
查看所有细微差别的最佳方法是运行:
CREATE TABLE `mytable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`int1` int(10) NOT NULL,
`int2` int(3) NOT NULL,
`zerofill1` int(10) ZEROFILL NOT NULL,
`zerofill2` int(3) ZEROFILL NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `mytable`
(`int1`, `int2`, `zerofill1`, `zerofill2`)
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);
select * from mytable;
这将输出:
+----+-------+-------+------------+-----------+
| id | int1 | int2 | zerofill1 | zerofill2 |
+----+-------+-------+------------+-----------+
| 1 | 10000 | 10000 | 0000010000 | 10000 |
| 2 | 100 | 100 | 0000000100 | 100 |
+----+-------+-------+------------+-----------+
请注意 int1 列的显示宽度比 zerofill2 小得多,即使长度较大 .
这个答案是针对Linux的MySQL 5.7.12进行测试的,对于其他实现可能会有所不同 .