Kiedy należy używać UNSIGNED i SIGNED INT w MySQL?

102

Kiedy należy używać UNSIGNED i SIGNED INT w MySQL? Co jest lepsze w użyciu, czy to tylko osobiste preferencje? Ponieważ widziałem, jak to jest używane;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

i

id INT(11) NOT NULL AUTO_INCREMENT
Smoking
źródło
4
Negatywne PK nie mają większego sensu
zerkms

Odpowiedzi:

165

UNSIGNEDprzechowuje tylko liczby dodatnie (lub zero). Z drugiej strony, podpisany może przechowywać liczby ujemne (tj. Może mieć znak ujemny ).

Oto tabela zakresów wartości, które INTEGERmoże przechowywać każdy typ:

Typy i długości MySQL INTEGER
Źródło: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDwaha się od 0do n, a ze znakiem od około -n/2do n/2.

W takim przypadku masz AUTO_INCREMENTkolumnę ID, więc nie masz negatywów. Dlatego użyj UNSIGNED. Jeśli nie użyjesz UNSIGNEDdla AUTO_INCREMENTkolumny, maksymalna możliwa wartość będzie o połowę niższa (a ujemna połowa zakresu wartości pozostanie niewykorzystana).

Mądry gość
źródło
16
Należy jednak pamiętać, że UNSIGNEDjest to specyficzne dla MySQL, a nie standardowa funkcja SQL. Oznacza to, że używanie UNSIGNEDmoże utrudnić przyszłą migrację do innego RDBMS lub spowodować trudności podczas korzystania z bibliotek oprogramowania przeznaczonych dla standardowego języka SQL, takiego jak SQLAlchemy. Myślę, że to powinno być częścią odpowiedzi.
minexew
8

Posługiwać się UNSIGNED do nieujemnych liczb całkowitych.

Paul Denisevich
źródło
4

Zasadniczo UNSIGNEDdajesz sobie dwa razy więcej miejsca na liczbę całkowitą, ponieważ wyraźnie określasz, że nie potrzebujesz liczb ujemnych (zwykle dlatego, że przechowywane wartości nigdy nie będą ujemne).

Srneczek
źródło
1

Nie zgadzam się z vipin cp .

Prawdą jest, że pierwszy bit jest używany do reprezentowania znaku. Ale 1 oznacza wartości ujemne, a 0 - wartości dodatnie. Co więcej, wartości ujemne są kodowane w inny sposób (dopełnienie do dwóch). Przykład z 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  
Kinga the Witch
źródło
1

Dla ujemnej wartości całkowitej SIGNEDjest używana, a dla nieujemnej liczby całkowitej UNSIGNEDjest używana. Zawsze sugerowano użycie UNSIGNEDidentyfikatora jako klucza podstawowego.

Szejk Hafizur Rahman
źródło
0

Jedna rzecz, którą chciałbym dodać w a signed int, która jest default value in mysql, 1 bitbędzie używana do reprezentowania sign. -1 for negative and 0 for positive. Więc jeśli twoja aplikacja wstawia tylko wartość dodatnią, powinna lepiej określać bez znaku.

vipin cp
źródło
0

Jeśli znasz rodzaj numerów, które zamierzasz przechowywać, możesz odpowiednio wybrać. W tym przypadku masz 'id', które nigdy nie może być ujemne. Możesz więc użyć unsigned int. Zakres liczby int ze znakiem: -n / 2 do + n / 2 Zakres liczby int bez znaku: od 0 do n Mamy więc podwojoną liczbę dostępnych liczb dodatnich. Wybierz odpowiednio.

Debanik Dawn
źródło
0

Myślę, UNSIGNEDże najlepszą opcją byłoby przechowywanie czegoś takiego jak time_duration(np:) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)wartość w formacie minut lub godzin lub sekund, które z pewnością będą liczbą nieujemną

Kamal
źródło