Коли слід використовувати UNSIGNED і SIGNED INT у MySQL?


101

Коли слід використовувати UNSIGNED і SIGNED INT у MySQL? Що краще використовувати, чи це лише особиста перевага? Тому що я бачив, як це використовується в такий спосіб;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

і

id INT(11) NOT NULL AUTO_INCREMENT

4
Негативні ПК не мають особливого сенсу
zerkms

Відповіді:


164

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стовпця, ваше максимально можливе значення буде вдвічі меншим (а негативна половина діапазону значень залишиться невикористаною).


14
Однак зауважте, що UNSIGNEDMySQL є специфічним, а не стандартною функцією 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використовується. Він завжди пропонував використовувати UNSIGNEDдля ідентифікатора як ПЕРВИННИЙ КЛЮЧ.


0

Одне, що я хотів би додати In signed int, яке є default value in mysql, 1 bitбуде використано для представлення sign. -1 for negative and 0 for positive. Отже, якщо ваша програма додає лише позитивне значення, краще вказувати без підпису.


0

Якщо ви знаєте тип номерів, які збираєтеся зберегти, ви можете вибрати їх відповідно. У цьому випадку у вас є "ідентифікатор", який ніколи не може бути негативним. Тож ви можете використовувати непідписаний 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.