Wann sollte ich UNSIGNED und SIGNED INT in MySQL verwenden?


99

Wann sollte ich UNSIGNED und SIGNED INT in MySQL verwenden? Was ist besser zu benutzen oder dies ist nur eine persönliche Präferenz? Weil ich gesehen habe, wie es so benutzt wurde;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

und

id INT(11) NOT NULL AUTO_INCREMENT

4
Negative PK machen nicht viel Sinn
zerkms

Antworten:


162

UNSIGNEDspeichert nur positive Zahlen (oder Null). Andererseits kann ein Vorzeichen negative Zahlen speichern (dh ein negatives Vorzeichen haben ).

Hier ist eine Tabelle der Wertebereiche, die jeder INTEGERTyp speichern kann:

MySQL INTEGER Typen und Längen
Quelle: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDreicht von 0bis n, während signiert von ungefähr -n/2bis reicht n/2.

In diesem Fall haben Sie eine AUTO_INCREMENTID-Spalte, sodass Sie keine Negative haben würden. Verwenden Sie also UNSIGNED. Wenn Sie nicht UNSIGNEDfür die AUTO_INCREMENTSpalte verwenden, ist Ihr maximal möglicher Wert halb so hoch (und die negative Hälfte des Wertebereichs würde nicht verwendet).


14
Beachten Sie jedoch, dass dies UNSIGNEDMySQL-spezifisch und keine Standard-SQL-Funktion ist. Dies bedeutet, dass die Verwendung UNSIGNEDeine zukünftige Migration auf ein anderes RDBMS komplizierter machen oder Ihnen Schwierigkeiten bereiten kann, wenn Sie Softwarebibliotheken verwenden, die auf Standard-SQL wie SQLAlchemy abzielen. Ich denke, das sollte ein Teil der Antwort sein.
Minexew


4

Grundsätzlich UNSIGNEDgeben Sie sich doppelt so viel Platz für die Ganzzahl, da Sie explizit angeben, dass Sie keine negativen Zahlen benötigen (normalerweise, weil die von Ihnen gespeicherten Werte niemals negativ sind).


1

Ich bin nicht einverstanden mit vipin cp .

Das wahre ist, dass das erste Bit zur Darstellung des Vorzeichens verwendet wird. Aber 1 ist für negative und 0 ist für positive Werte. Mehr als negative Werte werden unterschiedlich codiert (Zweierkomplement). Beispiel mit 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

Für den negativen ganzzahligen Wert SIGNEDwird verwendet und für den nicht negativen ganzzahligen Wert UNSIGNEDwird verwendet. Es wurde immer empfohlen, UNSIGNEDid als PRIMARY KEY zu verwenden.


0

Eine Sache, die ich hinzufügen möchte, wird in a signed int, das ist default value in mysql, 1 bitverwendet, um darzustellen sign. -1 for negative and 0 for positive. Wenn Ihre Anwendung also nur einen positiven Wert einfügt, sollte sie besser unsigned angeben.


0

Wenn Sie die Art der Nummern kennen, die Sie speichern möchten, können Sie diese entsprechend auswählen. In diesem Fall haben Sie eine 'ID', die niemals negativ sein kann. Sie können also unsigned int verwenden. Bereich der vorzeichenbehafteten int: -n / 2 bis + n / 2 Bereich der vorzeichenlosen int: 0 bis n Sie haben also die doppelte Anzahl positiver Zahlen zur Verfügung. Wählen Sie entsprechend.


0

Ich denke, UNSIGNEDwäre die beste Option, um so etwas wie time_duration(zB :) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)Wert im Minuten-, Stunden- oder Sekundenformat zu speichern, was definitiv eine nicht negative Zahl sein wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.