0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你真的能区别int(1)和int(10)的应用?

jf_ro2CN3Fa 来源:稀土掘金 2023-12-06 14:43 次阅读

困惑

最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解释。

其实这不是我第一次遇到这样的问题了,其中不乏有工作5年以上的老司机。包括我经常在也看到同事也一直使用int(10),感觉用了int(1),字段的上限就被限制,真实情况肯定不是这样。

数据说话

我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?

CREATETABLE`user`(
`id`int(1)unsignedNOTNULLAUTO_INCREMENT,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;

id字段为无符号的int(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)后面加了个zerofill,我们先来插入4条数据。

mysql>INSERTINTO`user`(`id`)VALUES(1),(10),(100),(1000);
QueryOK,4rowsaffected(0.00sec)
Records:4Duplicates:0Warnings:0

分别插入1、10、100、1000 4条数据,然后我们来查询下:

mysql>select*fromuser;
+------+
|id|
+------+
|0001|
|0010|
|0100|
|1000|
+------+
4rowsinset(0.00sec)

通过数据可以发现 int(4) + zerofill实现了不足4位补0的现象,单单int(4)是没有用的。而且对于0001这种,底层存储的还是1,只是在展示的会补0。

总结

int后面的数字不能表示字段的长度,int(num)一般加上zerofill,才有效果。

zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 ... 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么你只能自己处理了。

cfd36f68-93d3-11ee-939d-92fbcf53809c.jpg

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Int
    Int
    +关注

    关注

    0

    文章

    22

    浏览量

    16012
  • MySQL
    +关注

    关注

    1

    文章

    775

    浏览量

    26006

原文标题:很多资深开发竟然都不清楚 int(1) 和 int(10) 的区别!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    当选用INT10组的int1int2时会进入interrupt void rsvd函数,而选用INT1组的int1int2则不会出现这种现象是为什么

    如题,当选用INT10组的int1int2时会进入interrupt void rsvd_ISR函数,而如果选用INT1组的int1
    发表于 06-08 15:48

    基于单片机的中断控制程序(INT0+INT1)【C语言】

    基于单片机的中断控制程序(INT0+INT1)【C语言】
    发表于 12-29 18:17 23次下载

    Proteus之INT0的应用

    Proteus之INT0的应用,很好的Proteus资料,快来学习吧。
    发表于 04-18 15:34 0次下载

    Proteus之INT1的应用

    Proteus之INT1的应用,很好的Proteus资料,快来下载吧。
    发表于 04-18 15:34 0次下载

    Proteus之INT2的应用

    Proteus之INT2的应用,很好的Proteus资料,快来下载吧。
    发表于 04-18 15:34 0次下载

    Proteus之 INT0和INT1两个中断的应用

    Proteus之 INT0和INT1两个中断的应用,很好的Proteus资料,快来下载吧。
    发表于 04-18 15:34 0次下载

    Proteus之INT0和INT1控制的加减计数

    Proteus之INT0和INT1控制的加减计数,很好的Proteus资料,快来下载吧。
    发表于 04-18 15:34 0次下载

    基于8051的Proteus仿真-INT0及INT1中断计数

    基于8051的Proteus仿真-INT0及INT1中断计数
    发表于 09-01 23:29 33次下载

    使用51单片机的INT 0及INT 1中断计数的资料和程序免费下载

    本文档的主要内容详细介绍的是使用51单片机的INT 0及INT 1中断计数的资料和程序免费下载。
    发表于 09-02 17:28 0次下载
    使用51单片机的<b class='flag-5'>INT</b> 0及<b class='flag-5'>INT</b> 1中断计数的资料和程序免费下载

    INT0和INT1中断计数 PROTEUS 和51单片机教程(仿真文件+源代码)

    功能:INT0和INT1中断计数,INT0和INT1分别计数和清零,也可以把两个连在一起计数PROTEUS 和51单片机教程程序的C语言代码如下:/*
    发表于 11-22 16:36 19次下载
    <b class='flag-5'>INT</b>0和<b class='flag-5'>INT</b>1中断计数 PROTEUS 和51单片机教程(仿真文件+源代码)

    Int8量化-ncnn社区Int8重构之路

    本文是对NCNN社区int8模块的重构开发,再也不用担心溢出问题了,速度也还行。作者:圈圈虫首发知乎传送门ncnnBUG1989/caffe-int8-conver...
    发表于 02-07 12:38 1次下载
    <b class='flag-5'>Int</b>8量化-ncnn社区<b class='flag-5'>Int</b>8重构之路

    基于AT89C51单片机INT0及INT1中断计数仿真及代码

    基于AT89C51单片机INT0及INT1中断计数仿真及代码
    发表于 05-04 14:53 0次下载

    STC12C5A60S2-使用外中断INT0-INT1-测频率源代码

    STC12C5A60S2-使用外中断INT0-INT1-测频率源代码
    发表于 05-17 15:13 0次下载

    STC单片机INT0-INT1-外中断测试源代码

    STC单片机INT0-INT1-外中断测试源代码
    发表于 05-17 15:08 0次下载

    c语言int超出范围怎么办

    当在C语言中使用int类型时,有时候会遇到超出范围的情况。int类型通常表示的是有符号32位整数,范围是-2147483648到2147483647。当超出这个范围时,你需要采取一些措施来处理这个
    的头像 发表于 11-30 11:32 1705次阅读