Начал оптимизацию бд, посчитал, что в функции time 10 цифр. Когда будет 11, то наступит 2400 год. Вопрос: почему люди пишут int(11) вместо int(10)?
Ответ
Для int`а значение в скобках указывает не на длину значения, не на размер значения, а показывает лишь возможную длину вывода. И только в случае, когда у столбца указан атрибут zerofill
Рассмотрим примеры:
>> CREATE TABLE test (
id INT,
id1 INT(10),
id2 INT(11),
id3 INT(2),
id4 INT(10) ZEROFILL,
id5 INT(11) ZEROFILL,
id6 INT(2) ZEROFILL
);
>> SHOW CREATE TABLE test;
CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`id1` int(10) DEFAULT NULL,
`id2` int(11) DEFAULT NULL,
`id3` int(2) DEFAULT NULL,
`id4` int(10) unsigned zerofill DEFAULT NULL,
`id5` int(11) unsigned zerofill DEFAULT NULL,
`id6` int(2) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
>> INSERT INTO test VALUES
(1, 1, 1, 1, 1, 1, 1),
(111, 111, 111, 111, 111, 111, 111);
>> SELECT * FROM test;
+------+------+------+------+------------+-------------+------+
| id | id1 | id2 | id3 | id4 | id5 | id6 |
+------+------+------+------+------------+-------------+------+
| 1 | 1 | 1 | 1 | 0000000001 | 00000000001 | 01 |
| 111 | 111 | 111 | 111 | 0000000111 | 00000000111 | 111 |
+------+------+------+------+------------+-------------+------+
Для столбцов id, id1, id2, id3 мы не указали атрибут ZEROFILL и в выводе этих столбцов нет никаких различий даже несмотря на то, что размер вывода для этих столбцов отличается.
Для столбцов id4, id5, id6 мы указали атрибут ZEROFILL и для каждого столбца свой размер вывода, поэтому если длина строкового представления числа меньше размера вывода (размера, указанного в скобках), то строковое представление числа будет дополнено нулями слева до требуемой длины.
Если же длина строкового представления числа больше размера вывода (столбец id6 и его значение 111), то никакого дополнения нулями не происходит
Стоит обратить внимание на поле id - размер вывода для него мы не указывали, но при этом в SHOW CREATE TABLE размер все равно проставлен и равен 11
11 - т.к. столбец id у нас INT, т.е. целое знаковое, согласно документации там может быть значение равное -2147483648, что как раз равно 11 знакам (10 цифр + знак минус)
Если же мы опишем столбец как INT UNSIGNED, то отрицательных значений быть не может (знака минус), а максимальное по длине число равно 4294967295, что равняется 10 знакам. Поэтому для INT UNSIGNED в выводе SHOW CREATE TABLE будет указано INT(10)
Комментариев нет:
Отправить комментарий