关于 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: 0 mysql> 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
表的 id1
、id2
字段的数据类型统一变成了 INT
,只是表结构的 INT 类型显示发生变化,对数据没有影响。
讨论:MySQL 整数类型扩展
MySQL 支持的整数类型所需要的存储(字节)和范围 如下:
如何选择整数类型?
-
是否使用负数?
如果使用负数,需要查看对应的整数类型允许插入的最大值是否满足要求;如果不使用负数,建议使用无符号整数类型;
-
如何选择性价比高的整数类型?
每个整数类型的插入值都有对应的上限,占用的存储(字节)越大,能够插入的数值也就越大,越消耗内存且计算效率越低,建议根据插入值的上限来选择合适的整数类型。
-
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: 0 mysql> 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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
看 MySQL Too many open files 报错监控截图丢给 AI 如何解决
社区王牌专栏《一问一实验:AI 版》全新改版归来,得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询,表达了想试用体验 ChatDBA 的意愿,对此我们表示感谢 🤟。 目前,ChatDBA 还在最后的准备阶段,会尽快跟大家见面。想预约试用的朋友,可以扫码文末的 意见反馈 填写调研问卷。我们正在对 DBA 群体试用大模型的情况进行调研,这对我们打磨 ChatDBA 的使用体验非常重要。 下面让我们正式进入《一问一实验:AI 版》的第 54 期。 问题 MySQL 报错:Too many open files 怎么处理? 实验 1. 将问题丢给 ChatDBA 我们先把这个问题丢给 ChatDBA,让他看下具体出了什么问题。 左侧为流程分析画布,展示 ChatDBA 对此问题的排查逻辑;右侧为互动区域 2. ChatDBA 协助问题排查 我们将问题输入进 ChatDBA 后,系统反馈先进行信息的收集。 这里 ChatDBA 要求输入一些系统的基本情况,因为该报错很有可能是由于文件描述符数量引起的,要求输入的信息分别为: open_files_limit ulimit...
- 下一篇
WinSCP 6.3.4 发布,Windows 图形化 SFTP 客户端
WinSCP 是一个 Windows 环境下使用的SSH的开源图形化SFTP客户端,同时支持SCP协议,它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。 目前,WinSCP 6.3.4 已经发布。该版本具体更新内容如下: TLS/SSL core 升级至 OpenSSL 3.2.2。 翻译更新:白俄罗斯语、丹麦语和俄语。 独立可执行安装程序可以在损坏的 MSI 安装程序上运行。2294 支持高达 16KB 的 WebDAV cookies。2289 错误修复:尝试在本身不支持校验和的 SFTP 服务器上自动执行文件同步时失败。2291 错误修复:远程面板在“ZIP and Upload”后不刷新。2292 更新说明:https://winscp.net/eng/docs/history#6.3.4
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Mario游戏-低调大师作品
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能