MySQL中,int(10) 的 10 代表什么?

在 MySQL 中,我们定义int类型时需要设置长度,比如INT(10),那么10 到底代表什么?如果超过这个范围会出现什么问题?这篇文章我们来详细地聊一聊。

含义

在数据类型如 INT 后面的括号中的数字(例如 INT(10))指定了显示宽度,即当使用 ZEROFILL 属性时,系统会在数值前补零以达到指定的宽度。

存储空间:INT 数据类型总是占用 4 字节(32 位),无论显示宽度是多少。取值范围:对于有符号的 INT,范围是 -2147483648 到 2147483647;对于无符号的 INT UNSIGNED,范围是 0 到 4294967295。显示宽度不会改变这一范围。ZEROFILL 的应用

当在 INT 类型后使用 ZEROFILL 时,MySQL 会在数值前补零,以符合指定的显示宽度。如下示例:

复制
CREATE TABLE users ( id INT(10) ZEROFILL, name VARCHAR(50) );1.2.3.4.

插入数据:

复制
INSERT INTO users (id, name) VALUES (123, Alice);1.

查询结果:

复制
+-----------+-------+ | id | name | +-----------+-------+ | 0000000123 | Alice | +-----------+-------+1.2.3.4.5.

在这个例子中,id 字段显示为 0000000123,达到 10 位宽度。

MySQL 8.0.17 及以后的变化

从 MySQL 8.0.17 版本开始,整数类型的显示宽度被废弃(deprecated),即使指定了显示宽度,默认情况下也不再影响存储或显示。这意味着:

影响:不再推荐在整数类型后指定显示宽度,如 INT(10) 中的 10 将被忽略,除非配合 ZEROFILL 使用。推荐做法:直接使用 INT 而无需指定显示宽度,除非确实需要与现有系统兼容或有特殊需求。

为了更好地理解INT,下面通过几个例子详细解释。

创建表并插入数据:

复制
CREATE TABLE example ( id INT(10) NOT NULL, name VARCHAR(50) ); INSERT INTO example (id, name) VALUES (1, John), (123456, Jane);1.2.3.4.5.6.

查询显示:

复制
SELECT * FROM example;1.

结果:

复制
+-------+-------+ | id | name | +-------+-------+ | 1 | John | | 123456 | Jane | +-------+-------+1.2.3.4.5.6.

在没有使用 ZEROFILL 的情况下,显示宽度 10 并未影响输出格式。

使用 ZEROFILL 的情况:

复制
CREATE TABLE example_zf ( id INT(10) ZEROFILL NOT NULL, name VARCHAR(50) ); INSERT INTO example_zf (id, name) VALUES (1, John), (123456, Jane); SELECT * FROM example_zf;1.2.3.4.5.6.7.8.

结果:

复制
+-----------+-------+ | id | name | +-----------+-------+ | 0000000001 | John | | 0000123456 | Jane | +-----------+-------+1.2.3.4.5.6.

这里,id 字段根据显示宽度 10 补充了前导零。

注意:由于 MySQL 8.0.17 及以后的版本中显示宽度被废弃,建议在设计数据库时避免依赖显示宽度,除非有明确的需求和兼容性考虑。

总结INT(10) 中的 10 代表的是显示宽度,它用于在与 ZEROFILL 一起使用时补充前导零。不影响数值的存储大小或取值范围。在 MySQL 8.0.17 及以后版本中,整数类型的显示宽度被废弃,建议不再使用这种方式指定宽度,除非有特定需求。

阅读剩余
THE END