正如其他人所说,列可以存储的最小/最大值以及它以字节为单位的存储量仅由类型定义,而不是长度。
很多这些答案都说(11) 部分只影响显示宽度,这并不完全正确,但主要是。
未指定填零的int(2)定义将:
- 仍然接受
100的值
- 输出时仍显示值
100(不是0或00)
-
显示宽度将是选择查询输出的最大值的宽度。
(2) 唯一会做的是如果还指定了 zerofill:
-
1 的值将显示为01。
- 在显示值时,列的宽度总是列可以采用的最大可能值,即 10 位整数,而不是显示最大值所需的最小宽度列需要在该特定选择查询中显示,这可能要小得多。
- 列仍然可以取,并显示超过长度的值,但这些值不会以 0 为前缀。
查看所有细微差别的最佳方法是运行:
CREATE TABLE `mytable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`int1` int(10) NOT NULL,
`int2` int(3) NOT NULL,
`zf1` int(10) ZEROFILL NOT NULL,
`zf2` int(3) ZEROFILL NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `mytable`
(`int1`, `int2`, `zf1`, `zf2`)
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);
select * from mytable;
将输出:
+----+-------+-------+------------+-------+
| id | int1 | int2 | zf1 | zf2 |
+----+-------+-------+------------+-------+
| 1 | 10000 | 10000 | 0000010000 | 10000 |
| 2 | 100 | 100 | 0000000100 | 100 |
+----+-------+-------+------------+-------+
此答案针对 Linux 的 MySQL 5.7.12 进行了测试,可能会或可能不会因其他实现而异。