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;
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).
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.
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).
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
|10000000b =-128d
...11111101b =-3d
11111110b =-2d
11111111b =-1d
00000000b =0d
00000001b =1d
00000010b =2d
...01111111b =127d
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.
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.
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.
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ą
Odpowiedzi:
UNSIGNED
przechowuje 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
INTEGER
może przechowywać każdy typ:Źródło: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html
UNSIGNED
waha się od0
don
, a ze znakiem od około-n/2
don/2
.W takim przypadku masz
AUTO_INCREMENT
kolumnę ID, więc nie masz negatywów. Dlatego użyjUNSIGNED
. Jeśli nie użyjeszUNSIGNED
dlaAUTO_INCREMENT
kolumny, maksymalna możliwa wartość będzie o połowę niższa (a ujemna połowa zakresu wartości pozostanie niewykorzystana).źródło
UNSIGNED
jest to specyficzne dla MySQL, a nie standardowa funkcja SQL. Oznacza to, że używanieUNSIGNED
moż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.Posługiwać się
UNSIGNED
do nieujemnych liczb całkowitych.źródło
Zasadniczo
UNSIGNED
dajesz 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).źródło
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:
źródło
Dla ujemnej wartości całkowitej
SIGNED
jest używana, a dla nieujemnej liczby całkowitejUNSIGNED
jest używana. Zawsze sugerowano użycieUNSIGNED
identyfikatora jako klucza podstawowego.źródło
Jedna rzecz, którą chciałbym dodać w a
signed int
, która jestdefault value in mysql
,1 bit
będzie używana do reprezentowaniasign
.-1 for negative and 0 for positive.
Więc jeśli twoja aplikacja wstawia tylko wartość dodatnią, powinna lepiej określać bez znaku.źródło
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.
źródło
Myślę,
UNSIGNED
że najlepszą opcją byłoby przechowywanie czegoś takiego jaktime_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ąźródło