专栏首页曲水流觞TechRill不要再被MYSQL的INT(M)给迷惑了

不要再被MYSQL的INT(M)给迷惑了

MYSQL里有些比较隐晦的知识点,经常被稀里糊涂的用错而不自知。以前评审过程发生的次数较多,索性随手写一些出来。前人栽个树,后人一定要乘凉啊!

表设计使用整型时,经常发现定义int括号里的M是五花八门的。误区是,不少人把M当成了数据库中存储的最大长度,而实际上这个代表的是显示宽度。只要是int类型,在数据库里的存储就一定是4个字节。

有符号整型:从-2^31(-2147483648) 到 2^31-1(2147483647)

无符号整型:从 0 到 2^32(4294967295)

那么这个M显示宽度到底怎么理解?这里先说个属性 zerofill(零填充)。因为只有用了这个属性,显示宽度才有存在的意义。

zerofill的作用说明

1. 当一个数值列类型被定义成zerofill时,查询此列MYSQL会自动在数值左侧填充0直到M长度,若数值长度已超过M, 则无需填充0;

2. 声明为zerofill的数值列,默认会自动加上 unsigned(无符号) 属性。这个很容易理解,在一个负号前填充0是没什么意义的。

上例子。

Step 1 >

创建一张测试表,都是整型列,M分别定义为0,1,6,11,15。后缀为“z”的列被声明为zerofill。

细心的人可以发现:

- 没有标注unsigned的zerofill列,在表创建完成之后也会自动加上unsigned

- M为0的整型列,有符号自动定义为11,无符号自动定义为10

Step 2 >

插入测试数据100,10000000(8位),2147483647(有符号整型最大值),4294967295(无符号整型最大值), 9223372036854775807(有符号BIGINT最大值)。

Step 3 >

运行select查询全部数据。

Step 4 >

简单解读一下:

- 不管M定义多长,INT可存储的数值范围都由 4个字节有无符号 来决定;

- 超过最大值不报错,直接存储最大值;

- 基于M显示宽度值来左填充0,只有声明zerofill的列才可以产生效果;

重申 >

若觉得使用int有点浪费,比如状态列,那可以使用tinyint, 千万不要想当然的以为int(1)存的是就一位数字,还沾沾自喜的觉得节省了存储空间。

题外话

To be honest,MYSQL这个设计个人感觉是个失败品。不少人建议过应该取缔它,不管用LPAD()还是换成CHAR都可以实现这个功能,且不会产生歧义。日常编码也建议使用后面这两者。

本文分享自微信公众号 - 曲水流觞TechRill(geniusiandev),作者:曲健Nicholas

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 不懂NOSQL这些知识, 怎么吹牛B

    刚刚出现NOSQL这个概念的时候,很多人都是似而非的字面理解成"不是SQL", 与传统的关系型数据库是两个完全独立的阵营,实际上完全不是这么回事。个人更倾向于理...

    曲水流觞
  • 35岁,我慌得一批

    本文准备以悲伤的基调起笔,最终以什么情绪落笔,各位看客所受所感必有不同,对你可能是欢快对他可能是更加的悲伤...而我尽量避免后者的发生,毕竟同是天涯沦落人,任谁...

    曲水流觞
  • DàYé玩转数据战略Step By Step

    我们先看看工业革命的演进路径,从1.0的蒸汽机时代,到2.0的电力、流水线和大规模生产时代,再到3.0的计算机自动化时代,最后是4.0的智能化时代。

    曲水流觞
  • 【TensorFlow开源2年官方回顾】下一个重要方向是分布式模型服务

    【新智元导读】 TensorFlow Serving 开源的一年半时间里取得了许多进展和性能提升,包括开箱即用的优化服务和可定制性,多模型服务,标准化模型格式,...

    新智元
  • 有了这个神器,再也不怕shell写得不对了

    写过shell脚本的人都知道,即便出现一些简单的语法错误,运行的时候也可能没有办法发现。有些看似运行正确的脚本,实际上可能在某些分支,某些场景下仍然出现错误,而...

    编程珠玑
  • PPTP服务端与客户端 修改默认PPTP默认端口1723

    linux pptp服务端: 我们在Linux下建立的pptpd端口号默认是1723,有时候这个端口并不是那么的好用,不是麽? 所以服务端修改端口号比较简单

    庞小明
  • 数学--数论--HDU 2674 沙雕题

    WhereIsHeroFrom: Zty, what are you doing ? Zty: I want to calculate N!.. Where...

    风骨散人Chiam
  • 远程连接腾讯云Centos系统的MySQL数据库

    使用mysql数据库,Mysql数据库是Mysql系统自带的数据库,带有用户表,我们可以添加用户,并授权

    SmileNicky
  • SuperSQL:跨数据源、跨DC、跨执行引擎的高性能大数据SQL中间件

    导语:SuperSQL是腾讯数据平台部自研的跨数据源、跨数据中心、跨执行引擎的统一大数据SQL分析平台/中间件,支持对接适配多类外部开源SQL执行引擎,如Sp...

    腾讯大数据
  • 为什么数字化转型离不开 MES

    MES(制造执行系统)连接了车间现场执行层和企业的上层业务信息层。随着越来越多的设备接入工业网络,MES 将会变成数字化制造的控制中心。

    李英杰同学

扫码关注云+社区

领取腾讯云代金券