今天一个实习生问了我一个问题,他说int(3),int(4),int 有区别吗?
我:。。。没关注过呀?
1. 网上学习
于是上网各种查文章,总结了下面4条结论:
- int类型的字段就是占四个字节,一个字节8位,也就是4*8=32位。
- int 可表示的范围:有符号为[-2147483648,2147483647],无符号为[0, 4294967295]
- 不论是选择int(3)还是int(11),它在数据库里面存储的都是4个字节的长度
- 当int(3) 配合zerofill 使用时,如果你输入的数值是17,系统会默认为你存储值为017
解释一下:这个3代表的仅是一个默认的长度,当不足3位时,系统会帮用零补全,当超过3位时,就没有任何的影响与副作用
2. 实践
收集好网上的结论后,进入了实测阶段
2.1 建表
CREATE TABLE `students` (
`sId` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`sInt` INT DEFAULT NULL,
`sInt_3` INT(3) ZEROFILL DEFAULT NULL,
`sInt_10` INT(10) UNSIGNED DEFAULT NULL,
`sInt_11` INT(11) ZEROFILL DEFAULT NULL,
PRIMARY KEY (`sId`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
2.2 验证网上结论
- 不用验证了,mysql 基础
- 创建一行数据,写入最大值,检查是否可以存储
INSERT into students values (1,2147483647,1,1,1)
- 创建一行数据,写入最大值,检查int(3)int(10)int(11)是否可以存储
INSERT into students values (3,2147483647,2147483647,2147483647,2147483647)
- 创建一行数据,int(3),int(10), int(11) 都写入17,检查存储结果
INSERT into students values (3,17,17,17,17)
总结:
Int 后面加的数据,并不会影响int的存储范围,同时int后面加了范围后,需要配置zerofill 才会有效,常用于编号之中如学号之类
测试结果和网上说的有所不同,并没有实现int(3) zerofill 后,宽度就只显示3位,而是不管设置几,宽度都是10位,输入的值不足10位,前面用0补齐
所以不知道是我mysql 版本问题还是哪里配置的问题,如果有了解的网友辛苦评论一把