Quand dois-je utiliser UNSIGNED et SIGNED INT dans MySQL?


102

Quand dois-je utiliser UNSIGNED et SIGNED INT dans MySQL? Qu'est-ce qui est préférable d'utiliser ou c'est juste une préférence personnelle? Parce que je l'ai vu utilisé comme ça;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

et

id INT(11) NOT NULL AUTO_INCREMENT

4
PK négatif n'a pas beaucoup de sens
zerkms

Réponses:


165

UNSIGNEDne stocke que des nombres positifs (ou zéro). D'autre part, signé peut stocker des nombres négatifs (c'est-à-dire, peut avoir un signe négatif ).

Voici un tableau des plages de valeurs que chaque INTEGERtype peut stocker:

Types et longueurs MySQL INTEGER
Source: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDvarie de 0à n, tandis que signé varie de environ -n/2à n/2.

Dans ce cas, vous avez une AUTO_INCREMENTcolonne ID, vous n'auriez donc pas de négatifs. Ainsi, utilisez UNSIGNED. Si vous ne l'utilisez pas UNSIGNEDpour la AUTO_INCREMENTcolonne, votre valeur maximale possible sera deux fois moins élevée (et la moitié négative de la plage de valeurs ne sera pas utilisée).


16
Notez cependant que UNSIGNEDc'est spécifique à MySQL et non une fonctionnalité SQL standard. Cela signifie que l'utilisation UNSIGNEDpeut compliquer une future migration vers un autre SGBDR ou vous causer des difficultés lors de l'utilisation de bibliothèques de logiciels ciblant SQL standard telles que SQLAlchemy. Je pense que cela devrait faire partie de la réponse.
minexew le


4

Fondamentalement UNSIGNED, vous vous donnez deux fois plus d'espace pour l'entier puisque vous spécifiez explicitement que vous n'avez pas besoin de nombres négatifs (généralement parce que les valeurs que vous stockez ne seront jamais négatives).


1

Je ne suis pas d'accord avec vipin cp .

Le vrai est que le premier bit est utilisé pour représenter le signe. Mais 1 est pour négatif et 0 pour les valeurs positives. De plus, les valeurs négatives sont codées de manière différente (complément à deux). Exemple avec 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

Pour une valeur entière négative, SIGNEDest utilisé et pour une valeur entière non négative, UNSIGNEDest utilisé. Il a toujours suggéré d'utiliser UNSIGNEDpour id comme clé primaire.


0

Une chose que je voudrais ajouter dans un signed int, qui est le default value in mysql, 1 bitsera utilisée pour représenter sign. -1 for negative and 0 for positive. Donc, si votre application n'insère qu'une valeur positive, il vaut mieux spécifier non signé.


0

Si vous connaissez le type de numéros que vous allez stocker, vous pouvez choisir en conséquence. Dans ce cas, vous avez un «identifiant» qui ne peut jamais être négatif. Vous pouvez donc utiliser des int non signés. Plage des entiers signés: -n / 2 à + n / 2 Plage des int non signés: 0 à n Vous avez donc deux fois le nombre de nombres positifs disponibles. Choisissez en conséquence.


0

Je pense que ce UNSIGNEDserait la meilleure option pour stocker quelque chose comme time_duration(Par exemple:) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)valeur au format minutes ou heures ou secondes qui sera certainement un nombre non négatif

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.