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

3天前 9.0k 0

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

技术社群的这篇文章《故障分析 | 关于 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 5.7升级8.0的INT的显示问题场景-1

升级后的表结构和数据

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

因此

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

3讨论:MySQL 整数类型扩展

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

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

如何选择整数类型?

  1. 是否使用负数?

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

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

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

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

int(num) 的使用场景

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

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

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

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

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

直接使用 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

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

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

近期更新的文章:《坐橐儿》《中国队“自己的”世界杯》《GOPS全球运维大会(北京站)》
《MySQL 5.7升级8.0和排序相关的问题和解决》
《存储IO性能优化策略、方案与瓶颈分析的场景》
热文鉴赏:《你不知道的C罗-Siu庆祝动作》《架构设计的15个关键概念》
《大阪环球影城避坑指南和功略》
《推荐一篇Oracle RAC Cache Fusion的经典论文》
《"红警"游戏开源代码带给我们的震撼》
文章分类和索引:《公众号1500篇文章分类和索引》

相关文章

最新发布!MySQL 9.0 的向量 (VECTOR) 类型文档更新
国产数据库中级认证HCIP-openGauss经验分享
保障数据完整性与稳定性:数据库一致性
OceanBase 里的 DDL 超时时间
OceanBase v3.1.x 将不再更新版本 | 社区月报2024.6
openGauss Developer Day 2024 | SIG组工作会议亮点回看!

发布评论