暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 5.7升级8.0的INT的显示问题场景

162

点击标题下「蓝色微信名」可快速关注

技术社群的这篇文章《故障分析 | 关于 MySQL 5.7 升级 8.0 时 INT 显示问题分析》给我们讲解了MySQL 5.7和8.0不同版本INT的显示问题,这可能是我们容易混淆的知识点。

1背景

MySQL 5.7 已经停止更新了,最新的版本是 5.7.44。很多客户为了安全或者新特性的需求要对存量的 MySQL 5.7 进行大版本升级。

本案例中的客户是从 MySQL 5.7.36 升级到 MySQL 8.0.35,升级完成后业务反馈表结构有变化,升级前某个表的字段数据类型为 INT(10)
,升级后变成了 INT
,客户咨询有什么影响没有?

故事开始前,先问个小问题,MySQL 中 INT(num)
 的作用是什么?能够限制插入的数据范围吗?如何正确的使用呢?

阅读之前大家先把答案默念一遍,然后根据下面的测试结果对比一下,是不是我们想的那样?

2本地复现

升级前的表结构和数据

升级后的表结构和数据

因此

MySQL 升级到 8.0.35 之后,t2
 表的 id1
id2
 字段的数据类型统一变成了 INT
。只是表结构的 INT 类型显示发生了变化,对数据没有影响。

3讨论:MySQL 整数类型扩展

MySQL 支持的整数类型所需要的存储(字节)和范围[1] 如下:

如何选择整数类型?

  1. 是否使用负数?

    如果使用负数,需要查看对应的整数类型允许插入的最大值是否满足要求;如果不使用负数,建议使用无符号整数类型;

  2. 如何选择性价比高的整数类型?

    每个整数类型的插入值都有对应的上限,占用的存储(字节)越大,能够插入的数值也就越大,越消耗内存且计算效率越低,建议根据插入值的上限来选择合适的整数类型。

  3. INT(num)
     并不能限制插入数值的范围!

int(num) 的使用场景

数据类型:INT(num)
 和 CHAR(num)
 的含义不同,很容易混淆。CHAR(num)
 中的 num
 是指插入字符的最大个数。

INT(num)
 中的 num
 需要配合 zerofill
 一起使用才能生效,表示显示宽度,不足这个宽度的用0补齐。单独使用 INT(num)
 并没有什么效果,也并不会限制插入的数据范围发生变化,所以不建议单独使用 INT(num)
INT(num)
 配合 zerofill
 一起使用时,MySQL 升级过程中不会对表结构做修改。

直接使用 INT

不同版本的 MySQL,直接使用 INT 类型时,表结构显示的 INT 也不同,MySQL 5.7.25 默认显示是 INT(11)
,如果配合 zerofill
 使用,默认显示是 INT(10)
。MySQL 8.0.35 默认还是 INT,配合 zerofill
 默认显示是 int(10)

参考资料

[1]

整数类型存储限制: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html


如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,




近期更新的文章:
坐橐儿
中国队“自己的”世界杯
GOPS全球运维大会(北京站)
MySQL 5.7升级8.0和排序相关的问题和解决
存储IO性能优化策略、方案与瓶颈分析的场景

热文鉴赏:
你不知道的C罗-Siu庆祝动作
架构设计的15个关键概念
大阪环球影城避坑指南和功略
推荐一篇Oracle RAC Cache Fusion的经典论文
"红警"游戏开源代码带给我们的震撼

文章分类和索引:
公众号1500篇文章分类和索引

文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论