Типы в MySQL: BigInt (20) vs Int(20)



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



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

792   6  

6 ответов:

см.http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html

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

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

каждый из них принимает не больше и не меньше значения, чем могут быть сохранены в их число байтов. Это означает, что 232 значения INT и 264 значения в a BIGINT.

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.....

вывод:

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

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

Comments

    Ничего не найдено.