专栏首页曲水流觞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)

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django学习-第七讲:django 中的常用字段、字段属性,外键和表关系、外键操作

    映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他...

    小海怪的互联网
  • 肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019

    近两年,知识图谱技术得到了各行各业的关注,无论是企业公司还是开发者个人,都对这项技术有着极大的了解与使用需求。在近日的 AI开发者大会(AI ProCon 20...

    AI科技大本营
  • 【渗透测试】通过实战教你通关Billu_b0x靶机

    靶机下载链接:https://download.vulnhub.com/billu/

    一名白帽的成长史
  • Django学习-第六讲(下):django数据库的ORM操作方法及常用字段

    1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。

    小海怪的互联网
  • 【SQL注入】SQL注入知识总结v1.0

    First of all,你的目标得有可以利用的漏洞才行,不存在什么万能代码的...

    一名白帽的成长史
  • Django学习-第十讲(上):QuerySet API 学习

    我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字.objects是一个django.db.models.manager....

    小海怪的互联网
  • Django学习-第十三讲(下):表单(一)forms.form、forms.modelform

    单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言。只要把input标签放在form标签中,然...

    小海怪的互联网
  • Django学习-第十一讲(上):ORM迁移命令

    将模型生成迁移脚本。模型所在的app,必须放在settings.py中的INSTALLED_APPS中。这个命令有以下几个常用选项:

    小海怪的互联网
  • MySQL · 引擎特性 · Group Replication内核解析

    为了创建高可用数据库系统,传统的实现方式是创建一个或多个备用的数据库实例,原有的数据库实例通常称为主库master,其它备用的数据库实例称为备库或从库slave...

    程序员小王
  • Django学习-第九讲:聚合函数,F、Q表达式

    如果你用原生SQL,则可以使用聚合函数来提取数据。比如提取某个商品销售的数量,那么可以使用Count,如果想要知道商品销售的平均价格,那么可以使用Avg。 聚...

    小海怪的互联网

扫码关注云+社区

领取腾讯云代金券