Типы в MySQL: BigInt (20) vs Int(20)
мне было интересно, в чем разница между BigInt,MediumInt и Int есть... казалось бы, очевидно, что они позволят для больших чисел; однако, я могу сделать Int(20) или BigInt(20) и казалось бы, что это не обязательно о размере.
некоторое понимание было бы удивительным,просто любопытно. Я использую MySQL некоторое время и пытался применить бизнес-потребности при выборе типов, но я никогда не понимал этот аспект.
6 ответов:
см.http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html
INT- четырехбайтовое целое число со знаком.
BIGINT- восьмибайтовое целое число со знаком.каждый из них принимает не больше и не меньше значения, чем могут быть сохранены в их число байтов. Это означает, что 232 значения
INTи 264 значения в aBIGINT.20 в
INT(20)иBIGINT(20)почти ничего не значит. Это подсказка для ширины дисплея. Это не имеет ничего общего с хранением, ни диапазон значений этого столбца будет принимать.практически, это влияет только на :
CREATE TABLE foo ( bar INT(20) ZEROFILL ); INSERT INTO foo (bar) VALUES (1234); SELECT bar from foo; +----------------------+ | bar | +----------------------+ | 00000000000000001234 | +----------------------+это общий источник путаницы для пользователей MySQL, чтобы увидеть
INT(20)и предположим, что это ограничение по размеру, что-то аналогичноеCHAR(20). Но это не так.
число в скобках в объявлении типа ширина дисплея, который не связан с диапазоном значений, которые могут быть сохранены в типе данных. Просто потому, что вы можете объявить
Int(20)не означает, что вы можете хранить значения до 10^20 в нем:[...] Эта необязательная ширина отображения может использоваться приложениями для отображения целочисленных значений, имеющих ширину меньше ширины, указанной для столбца, путем заполнения их пробелами слева. ...
ширина отображения не ограничивает диапазон значений, которые могут быть сохранены в столбце, а также количество цифр, отображаемых для значений, имеющих ширину, превышающую указанную для столбца.
для списка максимума и минимума значения, которые могут быть сохранены в каждом типе данных MySQL, см. здесь.
спецификация "BIGINT(20)" не является ограничением цифр. Это просто означает, что при отображении данных, если он использует менее 20 цифр, он будет дополнен нулями. 2^64-это жесткий предел для типа BIGINT и имеет 20 цифр, поэтому BIGINT(20) просто означает, что все, что меньше 10^20, будет дополнено пробелами на дисплее.
насколько я знаю, есть только одна маленькая разница, когда вы пытаетесь вставить значение, которое находится вне диапазона.
в примерах я буду использовать
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)
Я хотел добавить еще один пункт, если вы храните действительно большое число, как 902054990011312, то можно легко увидеть разницу
INT(20)иBIGINT(20). Желательно хранить вBIGINT.
приведем пример для 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 становится беззнаковым типом int, если вы вставляете минус, вы будете получить ошибкуOut of range value for column...... Но вы можете вставить минус в int_10. Также если вы вставите 4294967291 в int_10 вы получите ошибкуOut of range value for column.....вывод:
int (X) без ключевого слова
zerofill, равно диапазону int -2147483648~2147483647int (X) с ключевым словом
zerofill, поле равно unsigned int range 0~4294967295, если длина num меньше X, он заполнит 0 слева
Comments