关于 MySQL 5.7 升级 8.0 时 INT 显示问题分析

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

作者:张昊,DBA,主要负责 MySQL 故障处理、DMP 产品支持,擅长 MySQL,喜欢打球唱歌

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 1200 字,预计阅读需要 3 分钟。

背景

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

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

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

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

本地复现

升级前的表结构和数据

mysql> show create table t2\G
*************************** 1. row ***************************Table: t2
Create Table: CREATE TABLE `t2` (`id1` int(4) unsigned DEFAULT NULL,`id2` int(10) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)mysql> insert into t2 values(1,1),(10,10),(100,100),(1000,1000),(12345,12345);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0mysql> select * from t2;
+-------+-------+
| id1   | id2   |
+-------+-------+
|     1 |     1 |
|    10 |    10 |
|   100 |   100 |
|  1000 |  1000 |
| 12345 | 12345 |
+-------+-------+
5 rows in set (0.00 sec)

升级后的表结构和数据

mysql> show create table t2\G
*************************** 1. row ***************************Table: t2
Create Table: CREATE TABLE `t2` (`id1` int unsigned DEFAULT NULL,`id2` int unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)mysql> select * from t2;
+-------+-------+
| id1   | id2   |
+-------+-------+
|     1 |     1 |
|    10 |    10 |
|   100 |   100 |
|  1000 |  1000 |
| 12345 | 12345 |
+-------+-------+
5 rows in set (0.00 sec)

结论

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

讨论:MySQL 整数类型扩展

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

如何选择整数类型?

  1. 是否使用负数?

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

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

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

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

int(num) 的使用场景

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

mysql> show create table tv\G
*************************** 1. row ***************************Table: tv
Create Table: CREATE TABLE `tv` (`name` char(2) COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)mysql> insert into tv values('a');
Query OK, 1 row affected (0.01 sec)mysql> insert into tv values('aa');
Query OK, 1 row affected (0.01 sec)//超出 char(2) 的限制,无法插入
mysql> insert into tv values('aaa');
ERROR 1406 (22001): Data too long for column 'name' at row 1   

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

//升级前
mysql> show create table t1\G
*************************** 1. row ***************************Table: t1
Create Table: CREATE TABLE `t1` (`id1` int(4) unsigned zerofill DEFAULT NULL,`id2` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)mysql> insert into t1 values(1,1),(10,10),(100,100),(1000,1000),(12345,12345);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0mysql> select * from t1;
+-------+------------+
| id1   | id2        |
+-------+------------+
|  0001 | 0000000001 |
|  0010 | 0000000010 |
|  0100 | 0000000100 |
|  1000 | 0000001000 |
| 12345 | 0000012345 |
+-------+------------+
5 rows in set (0.00 sec)//升级后
mysql> show create table t1\G
*************************** 1. row ***************************Table: t1
Create Table: CREATE TABLE `t1` (`id1` int(4) unsigned zerofill DEFAULT NULL,`id2` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.01 sec)mysql> select * from t1;
+-------+------------+
| id1   | id2        |
+-------+------------+
|  0001 | 0000000001 |
|  0010 | 0000000010 |
|  0100 | 0000000100 |
|  1000 | 0000001000 |
| 12345 | 0000012345 |
+-------+------------+
5 rows in set (0.00 sec)

直接使用 INT

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

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript日期对象、DOM节点操作(查找、增加、克隆、删除)

目录 1. 日期对象2. DOM节点操作2.1 查找节点2.2 增加节点2.3 克隆节点2.4 删除节点 1. 日期对象 实例化日期对象: 获取当前时间: new Date()获取指定时间: new Date(2023-12-1 17:12:08) 日期对象方法: 方法作用说明getFullYear()获得年份获取四位年份getMonth…

logback-spring.xml 小记

为什么不用logback.xml 名字 加载顺序:logback.xml>application.yml>logback-spring.xml 使用xml中使用到配置文件属性时,就会报错 为什么logback中记录不到运行时报错 logback获取不到堆栈错误 解决办法:在全局错误出使用log.error()指定输出 为什么打印不出来myba…

“首秀”欧洲杯,海信冰箱欧洲市占率居国产品牌首位

随着欧洲杯的火热开赛,挑灯夜战、观看球赛的时刻已经来临。此时,你需要何物相伴?是打开冰箱,取出真空腌制的食材,亲手烹饪一场观赛盛宴?还是取出极致保鲜的荔枝、樱桃,一边观赛一边品味&#xf…

部署yum仓库

目录 安装软件包 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall…

如何使用Vue3和ApexCharts轻松创建交互式图表

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于Vue3的ApexCharts动态图表展示 应用场景 本代码段适用于在Vue3应用中使用ApexCharts库创建交互式、可视化的图表。这些图表可以用于展示各种数据,例如销售额、支出、利润等,从而帮…

006 spring事务支持

文章目录 事务回顾事务介绍事务并发问题(隔离性导致)事务隔离级别 Spring框架事务管理相关接口Spring框架事务管理的分类编程式事务管理(了解)声明式事务管理(重点) 事务管理之XML方式业务层持久层单元测试代码配置事务管理的AOP 事务管理之混合方式事务管理之基于AspectJ的纯注…

不重新安装Anaconda找回不见的Anaconda Prompt

找回Anaconda Prompt只需三步 系统:win11 x641.cd Anaconda的安装目录2. Anaconda Prompt又回来了 系统:win11 x64 1.cd Anaconda的安装目录 winR 输入cmd 进入命令行,进入到Anaconda的安装目录 eg:我的Anaconda安装在&#xff…

一个简单的信号发射电路的构建

在基本的信号发射电路中,线圈(电感器)和电阻的组合可以产生振荡信号,而天线(通常通过线圈)用于发射信号。 LC振荡电路: **线圈(L1)和电容器(C)**串…

Ubuntu24多版本python解释器使用

1.前言 已给树莓派5安装了Ubuntu24.04,带有python3.12.3,现在用视觉需要用到3.11版本的python解释器 2.实操过程 主要是对用到的命令进行备份,方便后面查询 2.1 安装python3.11 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-ge…

底价竞拍成功,兴业法拍网何淑帅助高先生圆梦三居~

今日我们荣幸地向大家宣告一条喜讯。三部法拍经理何淑帅以其卓越的能力与竭诚的服务态度,成功助力高先生起拍价成交顺义裕龙六区的一套三居室。 高先生经朋友介绍与三部经理何淑帅结缘,他本身对该小区有所知晓,且正好在周边工作,何…

2.什么是计算机程序

什么是计算机程序? 计算机程序是为了告诉计算机"做某件事或解决某个问题"而用"计算机语言编写的命令集合(语句) 只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作,计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成 现实生活中你如…

JVM 基本组成

一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据,通过文字搜索图片,Chroma 支持文字和图片,通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP(Contrastive Language-Image Pretraining&…

Ps:脚本与动作

有三种脚本语言可用于编写 Photoshop 脚本:AppleScript(macOS)、JavaScript 和 VBScript(Windows)。 Photoshop 脚本文件默认文件夹 Win:C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…

代码随想录-Day35

134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 …

Java阻塞队列:DelayQueue

Java阻塞队列:DelayQueue 在Java的并发编程中,阻塞队列是一种非常有用的数据结构,它不仅提供了线程安全的队列操作,还在必要时会自动阻塞获取操作,直到队列变得不为空。本文将重点介绍一种特殊的阻塞队列——DelayQue…

递归与回溯 || 排列问题

目录 前言: 全排列 题解: 全排列 II 题解: 子集 题解: 组合 题解: 组合总和 题解: 电话号码的字母组合 题解: 字母大小写全排列 题解: 优美的排列 题解:…

AI虚拟数字人上线需要办理哪些资质?

近年来,随着AI 技术快速发展,虚拟数字人行业也进入了新的发展阶段。AI 技术可覆盖虚拟数字人的建模、视频生成、驱动等全流程,一方面使虚拟数字人的制作成本降低、制作周期缩短,另一方面,多模态 AI 技术使得虚拟数字人…

[面试题]缓存

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis 什么是缓存?…

KVM虚拟化基础

虚拟化基础与分类 x86 CPU特权级别设为四个Ring:Kernel Mode运行在Ring 0、User Mode运行在Ring 3; 非硬件辅助虚拟化(一型) Hypervisor运行在Ring 0; Guest OS不做修改,以为自己运行在Ring 0上&#xff0…