Это 3-й день моего участия в августовском испытании обновлений, узнайте подробности события:Испытание августовского обновления
Озадаченный
Недавно столкнулся с проблемой.Есть таблица для добавления поля user_id.Поле user_id может быть очень большим,поэтому я оформил заказ на работу mysqlalter table xxx ADD user_id int(1). Руководитель увидел мой заказ на работу sql и сказал: этоint(1)Боюсь этого недостаточно.Далее объяснение.
На самом деле, я не первый раз сталкиваюсь с такой проблемой, и многие из них — старые водители, проработавшие более 5 лет. В том числе, я часто вижу, как мои коллеги все время используют int(10).Я чувствую, что при использовании int(1) верхняя граница поля ограничена.Реальная ситуация определенно не так.
данные говорят
Мы знаем, что int занимает 4 байта в mysql, поэтому для unsigned int максимальное значение равно 2^32-1 = 4294967295, что равно почти 4 млрд. Можем ли мы использовать int(1) для достижения этого максимального значения?
CREATE TABLE `user` (
`id` int(1) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
Поле идентификатора представляет собой целое число без знака (1), позвольте мне вставить максимальное значение, чтобы увидеть.
mysql> INSERT INTO `user` (`id`) VALUES (4294967295);
Query OK, 1 row affected (0.00 sec)
Видно, что это успешно, что указывает на то, что число за int не влияет на размер, поддерживаемый самим int.Нет никакой разницы между int(1), int(2)...int(10).
заполнение нулями
Как правило, числа после int допустимы только при использовании вместе с zerofill. Давайте посмотрим на пример:
CREATE TABLE `user` (
`id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
Обратите внимание, что после int(4) добавляется нулевое заполнение.Давайте сначала вставим 4 фрагмента данных.
mysql> INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
Вставьте 1, 10, 100, 1000 4 части данных соответственно, а затем давайте запросим:
mysql> select * from user;
+------+
| id |
+------+
| 0001 |
| 0010 |
| 0100 |
| 1000 |
+------+
4 rows in set (0.00 sec)
По данным можно обнаружить, что int(4) + zerofill реализует явление заполнения 0 менее чем 4 битами, а int(4) сам по себе бесполезен. А для 0001 базовое хранилище по-прежнему равно 1, но отображение будет заполнено 0.
Суммировать
Число после int не может представлять длину поля.Int(num) обычно действует при добавлении нуля. Роль заполнения нулями обычно можно использовать в некоторых числах, связанных с числами, таких как номера студентов 001 002 ... 999. Если mysql не имеет функции заполнения нулями, но вы хотите форматировать и выводить числа равной длины, то вы справиться можно только самому.