Quando dovrei usare UNSIGNED e SIGNED INT in MySQL?


Risposte:


164

UNSIGNEDmemorizza solo numeri positivi (o zero). D'altra parte, firmato può memorizzare numeri negativi (cioè, può avere un segno negativo ).

Ecco una tabella degli intervalli di valori che ogni INTEGERtipo può memorizzare:

Tipi e lunghezze di MySQL INTEGER
Fonte: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDvaria da 0a n, mentre firmato varia da circa -n/2a n/2.

In questo caso, hai una AUTO_INCREMENTcolonna ID, quindi non avresti negativi. Quindi, usa UNSIGNED. Se non si utilizza UNSIGNEDper la AUTO_INCREMENTcolonna, il valore massimo possibile sarà la metà del valore (e la metà negativa dell'intervallo di valori rimarrebbe inutilizzata).


14
Si noti, tuttavia, che UNSIGNEDè specifico di MySQL e non è una funzionalità SQL standard. Ciò significa che l'utilizzo UNSIGNEDpuò rendere più complicata una futura migrazione a un RDBMS diverso o causare difficoltà quando si utilizzano librerie software destinate a SQL standard come SQLAlchemy. Penso che questo dovrebbe essere una parte della risposta.
minexew


4

Fondamentalmente UNSIGNED, ti stai dando il doppio dello spazio per il numero intero poiché specifichi esplicitamente che non hai bisogno di numeri negativi (di solito perché i valori che memorizzi non saranno mai negativi).


1

Non sono d'accordo con vipin cp .

Il vero è che il primo bit è usato per rappresentare il segno. Ma 1 è per negativo e 0 è per valori positivi. Inoltre i valori negativi sono codificati in modo diverso (complemento a due). Esempio con 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

Per il valore intero negativo, SIGNEDviene utilizzato e per il valore intero non negativo, UNSIGNEDviene utilizzato. Ha sempre suggerito di utilizzare UNSIGNEDper id come CHIAVE PRIMARIA.


0

Una cosa che vorrei aggiungere in a signed int, che è default value in mysql, 1 bitsarà usata per rappresentare sign. -1 for negative and 0 for positive. Quindi, se la tua applicazione inserisce solo un valore positivo, dovrebbe specificare meglio unsigned.


0

Se conosci il tipo di numeri che intendi memorizzare, puoi scegliere di conseguenza. In questo caso hai "id" che non può mai essere negativo. Quindi puoi usare unsigned int. Intervallo di int con segno: da -n / 2 a + n / 2 Intervallo di int senza segno: da 0 a n Quindi hai il doppio del numero di numeri positivi disponibili. Scegli di conseguenza.


0

Penso che UNSIGNEDsarebbe l'opzione migliore per memorizzare qualcosa come il valore time_duration(ad es .:) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)in formato minuti o ore o secondi che sarà sicuramente un numero non negativo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.