你好,我是猿java。
在 MySQL 中,我们定义int类型时需要设置长度,比如INT(10)
,那么10
到底代表什么?如果超过这个范围会出现什么问题?这篇文章我们来详细地聊一聊。
1. 含义
在数据类型如 INT
后面的括号中的数字(例如 INT(10)
)指定了显示宽度 ,即当使用 ZEROFILL
属性时,系统会在数值前补零以达到指定的宽度。
- 存储空间 :
INT
数据类型总是占用 4 字节(32 位),无论显示宽度是多少。 - 取值范围 :对于有符号的
INT
,范围是-2147483648
到2147483647
;对于无符号的INT UNSIGNED
,范围是0
到4294967295
。显示宽度不会改变这一范围。
2. ZEROFILL
的应用
当在 INT
类型后使用 ZEROFILL
时,MySQL 会在数值前补零,以符合指定的显示宽度。如下示例:
sql
CREATE TABLE users (
id INT(10) ZEROFILL,
name VARCHAR(50)
);
插入数据:
sql
INSERT INTO users (id, name) VALUES (123, 'Alice');
查询结果:
diff
+-----------+-------+
| id | name |
+-----------+-------+
| 0000000123 | Alice |
+-----------+-------+
在这个例子中,id
字段显示为 0000000123
,达到 10 位宽度。
3. MySQL 8.0.17 及以后的变化
从 MySQL 8.0.17 版本开始,整数类型的显示宽度被废弃(deprecated),即使指定了显示宽度,默认情况下也不再影响存储或显示。这意味着:
-
影响 :不再推荐在整数类型后指定显示宽度,如
INT(10)
中的10
将被忽略,除非配合ZEROFILL
使用。 -
推荐做法 :直接使用
INT
而无需指定显示宽度,除非确实需要与现有系统兼容或有特殊需求。
为了更好地理解INT
,下面通过几个例子详细解释。
创建表并插入数据:
sql
CREATE TABLE example (
id INT(10) NOT NULL,
name VARCHAR(50)
);
INSERT INTO example (id, name) VALUES (1, 'John'), (123456, 'Jane');
查询显示:
sql
SELECT * FROM example;
结果:
diff
+-------+-------+
| id | name |
+-------+-------+
| 1 | John |
| 123456 | Jane |
+-------+-------+
在没有使用 ZEROFILL
的情况下,显示宽度 10
并未影响输出格式。
使用 ZEROFILL
的情况:
sql
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;
结果:
diff
+-----------+-------+
| id | name |
+-----------+-------+
| 0000000001 | John |
| 0000123456 | Jane |
+-----------+-------+
这里,id
字段根据显示宽度 10
补充了前导零。
注意:由于 MySQL 8.0.17 及以后的版本中显示宽度被废弃,建议在设计数据库时避免依赖显示宽度,除非有明确的需求和兼容性考虑。
5. 总结
-
INT(10)
中的10
代表的是显示宽度 ,它用于在与ZEROFILL
一起使用时补充前导零。 -
不影响数值的存储大小或取值范围。
-
在 MySQL 8.0.17 及以后版本中,整数类型的显示宽度被废弃,建议不再使用这种方式指定宽度,除非有特定需求。
6. 学习交流
如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。