场景
最近在技术评审的时候,有同事针对关于字段长度的sql提出了int(1)
怕是不够用吧,接下来是一顿解释。
其实实际工作情况中,大家可能也会遇到这种情况。经常也看到同事一直使用int(32)
,感觉用了int(1)
,字段的上限就被限制了,但实际情况肯定不是这样的。
实操演示
我们知道在mysql中int占4个字节,那么对于无符号的int,最大值是2^32-1=4294967295
,将近40亿,难道int(1)
,就不能到这个最大值了吗?
CREATE TABLE `t_test` (
`id_1` int(1) UNSIGNED NOT NULL,
`id_2` int(32) UNSIGNED NOT NULL
)
插入数据:
INSERT INTO t_test(id_1,id_2) VALUES(4294967295,4294967295);
查询数据:
SELECT * FROM t_test
可以看出是成功的,说明int后面的数字,不影响int本身支持的大小,int(1)和int(32)没什么区别。
零补充
一般int后面的数字,配合zerofill一起使用才有效。看个例子:
CREATE TABLE `t_test` (
`id` int(4) UNSIGNED ZEROFILL NOT NULL
)
注意int(4)
后面加了个ZEROFILL
,插入数据:
INSERT INTO t_test(id) VALUES(1);
查询数据:
SELECT * FROM t_test
可以发现int(4) + ZEROFILL实现了不足4补0的情况,单单int(4) 是没有效果的。并且对于0001这种,底层存储的还是1,只是展示的会补0。
总结
int(1)
和int(32)
在MySQL中表示的整数类型的范围是一样的,它们都可以存储从-2147483648到2147483647(对于int
UNSIGNED,则是从0到4294967295)的整数,在这个上下文中,括号内的数字并不限制数值的范围,而只是一个显示宽度提示,在使用ZEROFILL
时会有用。