Типы в MySQL: BigInt (20) против Int (20)

Мне было интересно, какая разница между BigInt, MediumInt и Int... казалось бы очевидным, что они позволят увеличить число; однако я могу сделать Int (20) или BigInt (20), и это показало бы, что это не обязательно размер.

Некоторое понимание было бы удивительным:), просто любопытно. Я использую mysql некоторое время и пытаюсь применить бизнес-потребности при выборе типов, но я никогда не понимал этого аспекта.

Ответ 1

См. http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

  • INT представляет собой четырехбайтовое целое число со знаком.

  • BIGINT - это восьмибайтовое целое число со знаком.

Они не принимают больше и не меньше значений, чем могут быть сохранены в их соответствующем количестве байтов. Это означает 2 32 значения в значениях INT и 2 64 в BIGINT.

20 в INT(20) и BIGINT(20) означают почти ничего. Это подсказка для ширины экрана. Он не имеет ничего общего с хранилищем или диапазоном значений, который будет принимать этот столбец.

Практически это влияет только на параметр ZEROFILL:

CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;

+----------------------+
| bar                  |
+----------------------+
| 00000000000000001234 |
+----------------------+

Это обычный источник путаницы для пользователей MySQL, чтобы увидеть INT(20) и предположить, что это ограничение по размеру, что-то похожее на CHAR(20). Это не так.

Ответ 2

Число в круглых скобках в объявлении типа - это ширина отображения, которая не связана с диапазоном значений, которые могут быть сохранены в типе данных. Просто потому, что вы можете объявить Int(20), не означает, что вы можете хранить в нем значения до 10 ^ 20:

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

Ширина дисплея не ограничивает диапазон значений, которые могут быть сохранены в столбце, а также количество цифр, отображаемых для значений, имеющих ширину, превышающую ширину, указанную для столбца. Например, столбец, указанный как SMALLINT (3), имеет обычный диапазон SMALLINT от -32768 до 32767, а значения вне диапазона, допустимого тремя символами, отображаются с использованием более трех символов.

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

Ответ 3

Цитата:

Спецификация "BIGINT (20)" не является предел цифр. Это просто означает, что при отображении данных, если он использует менее 20 цифр, он будет оставлен с нулями. 2 ^ 64 является жестким пределом для типа BIGINT и имеет 20 цифр, поэтому BIGINT (20) означает, что все меньше 10 ^ 20 будут оставлены с пробелами на дисплее.

Ответ 4

Я хотел добавить еще один момент: если вы храните действительно большое количество, например, 902054990011312, то можно легко увидеть разницу между INT (20) и BIGINT (20). Желательно хранить в BIGINT

Ответ 5

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

В примерах я использую 401421228216, который является 101110101110110100100011101100010111000 (длина 39)

  • Если у вас есть INT(20) для системы, это означает, что в памяти будет храниться минимум 20 бит. Но если вы введете значение, превышающее 2^20, оно будет сохранено успешно, только если оно меньше INT(32) -> 2147483647 (или 2 * INT(32) -> 4294967295 для UNSIGNED)

Пример:

mysql> describe `test`;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(20) unsigned | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
1 row in set (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected, 1 warning (0,06 sec)

mysql> SELECT * FROM `test`;
+------------+
| id         |
+------------+
| 4294967295 |
+------------+
1 row in set (0,00 sec)
  • Если у вас есть BIGINT(20) для системы, это означает выделение в памяти минимум 20 бит. Но если вы введете значение, большее, чем 2^20, оно будет сохранено успешно, если оно меньше BIGINT(64) -> 9223372036854775807 (или 2 * BIGINT(64) -> 18446744073709551615 для UNSIGNED)

Пример:

mysql> describe `test`;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | bigint(20) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected (0,04 sec)

mysql> SELECT * FROM `test`;
+--------------+
| id           |
+--------------+
| 401421228216 |
+--------------+
1 row in set (0,00 sec)