Когда мне следует использовать 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
8

Используйте UNSIGNEDдля неотрицательных целых чисел.

Павел Денисевич
источник
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. Поэтому, если ваше приложение вставляет только положительное значение, лучше указать беззнаковый.

vipin cp
источник
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)значения в формате минут, часов или секунд, которое определенно будет неотрицательным числом.

Камаль
источник