Когда мне следует использовать UNSIGNED и SIGNED INT в MySQL?


102

Когда мне следует использовать UNSIGNED и SIGNED INT в MySQL? Что лучше использовать или это просто личное предпочтение? Потому что я видел, как его использовали вот так;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

и

id INT(11) NOT NULL AUTO_INCREMENT

4
Отрицательный PK не имеет большого смысла
zerkms

Ответы:


165

UNSIGNEDхранит только положительные числа (или ноль). С другой стороны, знаковый может хранить отрицательные числа (т. Е. Может иметь отрицательный знак ).

Вот таблица диапазонов значений, которые INTEGERможет хранить каждый тип:

Типы и длины MySQL INTEGER
Источник: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDварьируется от 0до n, а со знаком - от примерно -n/2до n/2.

В этом случае у вас есть AUTO_INCREMENTстолбец идентификатора, поэтому у вас не будет негативов. Таким образом, используйте UNSIGNED. Если вы не используете UNSIGNEDдля AUTO_INCREMENTстолбца, ваше максимально возможное значение будет вдвое меньше (а отрицательная половина диапазона значений останется неиспользованной).


16
Однако обратите внимание, что UNSIGNEDэто специфичная для MySQL функция, а не стандартная функция SQL. Это означает, что использование UNSIGNEDможет усложнить будущую миграцию на другую СУБД или вызвать трудности при использовании программных библиотек, ориентированных на стандартный SQL, такой как SQLAlchemy. Я думаю, это должно быть частью ответа.
minexew


4

По сути UNSIGNED, вы даете себе вдвое больше места для целого числа, поскольку вы явно указываете, что вам не нужны отрицательные числа (обычно потому, что сохраняемые вами значения никогда не будут отрицательными).


1

Я не согласен с vipin cp .

Верно то, что первый бит используется для представления знака. Но 1 для отрицательных значений, а 0 для положительных значений. Более того, отрицательные значения кодируются по-разному (дополнение до двух). Пример с TINYINT:

The sign bit
|
1000 0000b = -128d  
...  
1111 1101b = -3d  
1111 1110b = -2d  
1111 1111b = -1d  

0000 0000b = 0d  
0000 0001b = 1d  
0000 0010b = 2d  
...  
0111 1111b = 127d  

1

Для отрицательного целочисленного значения SIGNEDиспользуется, а для неотрицательного целочисленного значения UNSIGNEDиспользуется. Всегда предлагалось использовать UNSIGNEDid в качестве ПЕРВИЧНОГО КЛЮЧА.


0

Одна вещь, которую я хотел бы добавить в a signed int, - это default value in mysql, 1 bitбудет использоваться для представления sign. -1 for negative and 0 for positive. Поэтому, если ваше приложение вставляет только положительное значение, лучше указать беззнаковый.


0

Если вы знаете, какие номера собираетесь хранить, вы можете выбрать соответствующий вариант. В этом случае у вас есть id, который никогда не может быть отрицательным. Таким образом, вы можете использовать unsigned int. Диапазон значений int со знаком: от -n / 2 до + n / 2 Диапазон значений int без знака: от 0 до n Таким образом, количество доступных положительных чисел в два раза больше. Выбирайте соответственно.


0

Я думаю, UNSIGNEDбыло бы лучшим вариантом сохранить что-то вроде time_duration(например:) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)значения в формате минут, часов или секунд, которое определенно будет неотрицательным числом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.