老司机深入虎穴探索Mysql中int(1)、int(10)、in
在上一篇原创文章MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据,最后留下了一个问题,大家知不知道int(1)和int(11)有什么区别,没有小伙伴互动回答,只有一位老哥让我说一下什么区别,我说上周安排,这不就打脸了,如果这位老哥能看到的话,说声抱歉,然后今天特地用这篇文章来回答这个问题。我相信一定会对有些小伙伴有所帮助。
看过上篇文章你一定知道了字段后面的unsigned是什么意思,其实就是很简单的基础,但是我见过有很多5年以上的开发人员不知道unsigned作用是什么。包括今天要讲的zerofill,不知道的人就更多了,我们太习惯舒适了,我们总是自嘲自己是CRUD程序员,可这种自嘲更多的是群嗨,有几个真正戳痛过自己。好了,点到为止,只是希望我们不要停止学习,不要埋葬探索的欲望。
回到正题,你在建字段id时,选择了int类型之后,后面的长度你习惯性的填上10或者11,你又建了一个type字段,选择了int之后,你又习惯性的在长度上填了1,很佩服大家如此的统一有默契。问其缘由,id自增长啊,肯定要长度长一点了,type一般就几个意思,长度为1就够了,我想如果tinyint会说话的话,一定会跳起来打你膝盖,咋地,质问你是看不起它还是咋地?
我不知道现在怎样,以前这种思想夸张点说真的是普遍现象,所有人都这么干,那么你真的用对了吗?下面,我们一起来揭开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,就是下图复选框打钩的填充零,这是什么意思呢?
image3、别着急,我们向表里插一条数据。
INSERT INTO `mzc`(`id`, `seq`, `val`, `num`, `sort`, `no`) VALUES (1, -12, 4567, 1, 1, 1);
4、你们猜,执行select * 之后是什么样?
SELECT * FROM mzc;
5、别走神,高潮要来了,我们来一探到底。
image咦、sort和no的值怎么前面填充了那么多0,我的天呐,这么神奇的吗?是不是和有些小伙伴想的不一样?
6、别泄气,再坚持一下,就用你们设想的姿势,我们给num插一个长度为10的值,就10个9吧,够大了吧?
INSERT INTO `mzc`(`id`, `seq`, `val`, `num`, `sort`, `no`) VALUES (2, -12, 4567, 9999999999, 1, 1);
你们猜怎么着,mysql说我耍流氓,说我太大了,超过它的承受范围了,终究是一个人扛下了所有。
image.pngint(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(无符号型)。
这张图再发一遍,希望可以加深大家的印象。
image回到我们第一次insert时候查询结果的截图:
image可以发现,int(10)与int(11)后的括号中的字符表示显示宽度,用于显示宽度小于指定的列宽度的值时从左侧填满宽度,比如我们定义了int(10),插入1,在1左侧补充9个0,最后显示0000000001,int(11)同理。如果显示宽度大于指定列宽就正常显示,如果int(3),插入1,会显示001,插入了4567,还是显示4567。
总结
-
int(1)、int(10)和int(11)本身是没有任何区别的,只有使用了zerofill之后,才会有显示宽度上的区别。
-
声明整型数据列时,我们可以为它指定显示宽度M(1~255),理论最大显示宽度为255。
-
如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。
上次留言的那位老哥,不知你有没有看到这篇文章,虽迟但到,希望没有辜负你的信任。如果这篇文章能帮一些小伙伴扫盲,那也算是幸事一件了,希望可以帮忙转发、在看,给点鼓励和支持!谢谢!
最后,因为文中开了点车,所以特地发另一篇文章,帮大家洗洗眼,感兴趣的话可以去第二篇文章读一读,句子很短,却充满故事和想象。