MySQL 8 игнорируя целочисленные длины - PullRequest
1 голос
/ 27 марта 2020

У меня 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;

Длина отображается как 0 в моем MySQL client (Navicat), но то же самое происходит при проверке в консоли с помощью 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 |         |
+---------------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+

В столбце Type должно быть показано int (11) для двух целочисленных полей, но это не так.

Это связано с чем-то в моих MySQL настройках, и если да, то какую переменную нужно будет изменить?

1 Ответ

2 голосов
/ 27 марта 2020

Это изменение задокументировано в примечаниях к выпуску 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)

Так что хорошо, что вводящее в заблуждение целое число "длина" теперь устарело и удалено. Это вызывало путаницу на протяжении многих лет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...