当前位置: 首页 > 后端技术 > Java

int(1)和int(10)有什么区别?连高级开发人员都搞错了!

时间:2023-04-01 19:03:15 Java

来源:juejin.cn/post/6992574502282477605百思不得其解最近遇到一个问题。如果有表,我需要添加一个user_id字段。user_id字段可能很大,所以提交了一个mysql工单altertablexxxADDuser_idint(1)。领导看了我的sql工单,就说:恐怕这个int(1)不够用,下一步就是解释了。其实这不是我第一次遇到这样的问题,工作5年以上的老司机也不少。包括我经常看到我的同事一直在使用int(10)。感觉如果用int(1)的话,字段的上限是有限的,现实中肯定不是这样的。说到数据,我们知道int在mysql中占4个字节,所以对于unsignedint来说,最大值是2^32-1=4294967295,接近40亿。难道int(1)达不到这个最大值??CREATETABLE`user`(`id`int(1)unsignedNOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;id字段是unsignedint(1),让我插入一个最大值看看。mysql>INSERTINTO`user`(`id`)VALUES(4294967295);QueryOK,1rowaffected(0.00sec)可以看出成功了,说明int后面的数字不影响int本身支持的大小,int(1),int(2)...int(10)没有区别。零填充一般int后面的数字,只有和zerofill一起使用才有效。先看一个例子:CREATETABLE`user`(`id`int(4)unsignedzerofillNOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;注意在int(4)addazerofill之后,我们先插入4条数据。mysql>INSERTINTO`user`(`id`)VALUES(1),(10),(100),(1000);QueryOK,4rowsaffected(0.00sec)Records:4Duplicates:0Warnings:0单独插入1,10,100,10004条数据,然后我们查询:mysql>select*fromuser;+------+|编号|+------+|0001||0010||0100||1000|+------+4rowsinset(0.00sec)通过数据可以发现,int(4)+zerofill实现了不足4位填充0的现象,int(4)单独是无用的。而对于0001,底层存储还是1,但是会增加0来显示。综上所述,int后面的数字不能代表字段的长度。一般int(num)加上zerofill就有效了。zerofill的功能一般可以用在与数字相关的数字上,比如学号001002...999。如果mysql没有补零的功能,但是你又想格式化输出等长的数字,那么你必须自己处理。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!

最新推荐
猜你喜欢