Типы в MySQL: BigInt (20) против Int (20) - PullRequest
190 голосов
/ 29 июня 2010

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

Некоторое понимание было бы потрясающим, просто любопытным. Некоторое время я использовал MySQL и пытался использовать бизнес-потребности при выборе типов, но я никогда не понимал этот аспект.

Ответы [ 6 ]

405 голосов
/ 29 июня 2010

См. http://dev.mysql.com/doc/refman/8.0/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).Это не тот случай.

38 голосов
/ 29 июня 2010

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

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

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

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

12 голосов
/ 29 июня 2010

Цитата

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

2 голосов
/ 12 октября 2017

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

В примерах я буду использовать 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)
1 голос
/ 04 апреля 2016

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

0 голосов
/ 13 апреля 2018

Давайте приведем пример для int (10), один с ключевым словом zerofill, один нет, таблице нравится:

create table tb_test_int_type(
    int_10 int(10),
    int_10_with_zf int(10) zerofill,
    unit int unsigned
);

Давайте вставим некоторые данные:

insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647) 
;

Тогда

select * from tb_test_int_type; 

# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'

Мы видим, что

  • с ключевым словом zerofill, число меньше 10 заполнит 0, но без zerofill не будет

  • Во-вторых, с ключевым словом zerofill int_10_with_zf становится типом unsigned int, если вы вставите минус, вы получите ошибку Out of range value for column......Но вы можете вставить минус в int_10.Также, если вы вставите 4294967291 в int_10, вы получите ошибку Out of range value for column.....

Вывод:

  1. int (X) без ключевого слова zerofill,равно int range -2147483648 ~ 2147483647

  2. int (X) с ключевым словом zerofill, поле равно целому диапазону без знака 0 ~ 4294967295, если длина num меньше Xзаполнит 0 слева

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