Mar*_*tin 3 mysql sql innodb mysql-8.0
我有一个 MySQL 8.0.19 在 Docker 容器中运行并使用 InnoDB 引擎。我注意到表整数字段长度被忽略了。
无论是运行 CREATE 还是 ALTER 查询,整数数据类型都会出现此问题
CREATE TABLE `test` (
`id` int DEFAULT NULL,
`text_field` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`decimal_field` decimal(6,2) DEFAULT NULL,
`int_field` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
长度在我的 MySQL 客户端 (Navicat) 中显示为 0,但如果使用SHOW FULL COLUMNS FROM
test在控制台中检查也会发生同样的情况;
mysql> SHOW FULL COLUMNS FROM `test`;
+---------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+---------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| id | int | NULL | YES | | NULL | | select,insert,update,references | |
| text_field | varchar(20) | utf8mb4_unicode_ci | YES | | NULL | | select,insert,update,references | |
| decimal_field | decimal(6,2) | NULL | YES | | NULL | | select,insert,update,references | |
| int_field | int | NULL | YES | | NULL | | select,insert,update,references | |
+---------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
Run Code Online (Sandbox Code Playgroud)
Type 列应该显示两个整数字段的 int(11) ,但它不是。
这是否与我的 MySQL 设置中的某些内容有关,如果是,则必须更改哪个变量?
这是MySQL 8.0.19 发行说明中记录的更改:
MySQL 8.0.17 中不推荐使用整数数据类型的显示宽度规范,现在在其输出中包含数据类型定义的语句不再显示整数类型的显示宽度,以下情况除外:
类型是 TINYINT(1)。MySQL 连接器假设 TINYINT(1) 列起源于 BOOLEAN 列;这一例外使他们能够继续做出这种假设。
该类型包括 ZEROFILL 属性。
此更改适用于表、视图和存储例程,并影响 SHOW CREATE 和 DESCRIBE 语句以及 INFORMATION_SCHEMA 表的输出。
对于 DESCRIBE 语句和 INFORMATION_SCHEMA 查询,在以前的 MySQL 8.0 版本中创建的对象的输出不受影响,因为已存储在数据字典中的信息保持不变。此例外不适用于从 MySQL 5.7 到 8.0 的升级,为此重新创建所有数据字典信息,以便数据类型定义不包括显示宽度。(错误#30556657,错误#97680)
整数列的“长度”没有任何意义。的列int(11)
与int(2)
或相同int(40)
。它们都是固定大小的 32 位整数数据类型。它们支持相同的最小值和最大值。
整数列的“长度”多年来一直是 MySQL 的一个令人困惑的特性。这只是影响显示宽度的提示,而不是存储或值的范围。实际上,只有在您使用该ZEROFILL
选项时才重要。
mysql> create table t ( i1 int(6) zerofill, i2 int(12) zerofill );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t set i1 = 123, i2 = 123;
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+--------+--------------+
| i1 | i2 |
+--------+--------------+
| 000123 | 000000000123 |
+--------+--------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
因此,现在已弃用并删除了误导性整数“长度”,这是一件好事。多年来,它引起了混乱。