老司机深入虎穴探索Mysql中int(1)、int(10)、int(11)的区别是什么?
与精品技术文章不期而遇
1、我们先随便建一张表,定义几个字段,如下图所示:
DROP TABLE IF EXISTS mzc;
CREATE TABLE `mzc` (
`id` int(1) unsigned zerofill NOT NULL AUTO_INCREMENT,
`seq` int(1) DEFAULT NULL,
`val` int(3) DEFAULT NULL,
`num` int(10) unsigned DEFAULT NULL,
`sort` int(10) unsigned zerofill DEFAULT NULL,
`no` int(11) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2、眼尖的小伙伴应该也发现了这些字段都是int类型,只不过后面跟着不同的属性修饰,上一篇unsigned我就不啰嗦了,这次有的int后面多了个zerofill,就是下图复选框打钩的填充零,这是什么意思呢?
3、别着急,我们向表里插一条数据。
INSERT INTO `mzc`(`id`, `seq`, `val`, `num`, `sort`, `no`) VALUES (1, -12, 4567, 1, 1, 1);
4、你们猜,执行select * 之后是什么样?
SELECT * FROM mzc;
5、别走神,高潮要来了,我们来一探到底。
6、别泄气,再坚持一下,就用你们设想的姿势,我们给num插一个长度为10的值,就10个9吧,够大了吧?
INSERT INTO `mzc`(`id`, `seq`, `val`, `num`, `sort`, `no`) VALUES (2, -12, 4567, 9999999999, 1, 1);
int(10)尚且如此,那有的小伙伴想插入长度11位的值该怎么办,我想还是死了这条心吧,下车冷静冷静,是时候真正了解int(1)、int(10)、int(11)了。
我们来看一下Mysql手册上是怎么介绍的:
int(M): M indicates the maximum display width for integer types.1
这句话的意思就是:在 integer 数据类型中,M 表示最大显示宽度。
也就是说:
int(M)中,M的值与int(M)所占多少存储空间没有任何关系,int(1)、int(10)、int(11) 在磁盘上都是占用 4 btyes 的存储空间。
与int类型的字段能存储的数据最大最小值也没有任何关系,int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。
这张图再发一遍,希望可以加深大家的印象。
回到我们第一次insert时候查询结果的截图:
总结
int(1)、int(10)和int(11)本身是没有任何区别的,只有使用了zerofill之后,才会有显示宽度上的区别。
声明整型数据列时,我们可以为它指定显示宽度M(1~255),理论最大显示宽度为255。
如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。
上次留言的那位老哥,不知你有没有看到这篇文章,虽迟但到,希望没有辜负你的信任。如果这篇文章能帮一些小伙伴扫盲,那也算是幸事一件了,希望可以帮忙转发、在看,给点鼓励和支持!谢谢!
最后,因为文中开了点车,所以特地发另一篇文章,帮大家洗洗眼,感兴趣的话可以去第二篇文章读一读,句子很短,却充满故事和想象。
好文,点个在看吧