50 votes

Signé ou non signé dans MySQL

Je me demande s'il y a un effet positif à utiliser le drapeau UNSIGNED pour définir un champ entier dans MySQL ? Les requêtes sont-elles plus rapides ou la base de données plus petite ? Ou dois-je m'en préoccuper uniquement si je suis préoccupé par la limite supérieure ?

0 votes

57voto

Kevin Loney Points 3706

Selon section 10.2 du manuel de MySQL 5.1 :

En mode non strict, lorsqu'une valeur hors plage est attribuée à une colonne entière, MySQL stocke la valeur représentant l'extrémité correspondante correspondant du type de données de la colonne gamme. Si vous stockez 256 dans une colonne TINYINT ou un TINYINT UNSIGNED, MySQL stocke 127 ou 255, respectivement. Lorsque une colonne à virgule flottante ou à virgule fixe est affectée à une valeur qui dépasse la plage impliquée par la précision et l'échelle spécifiées (ou précision et l'échelle spécifiées (ou par défaut), MySQL stocke la valeur représentant le l'extrémité correspondante de cette plage.

Ainsi, l'utilisation de UNSIGNED n'est vraiment nécessaire que lorsque vous vous préoccupez de la limite supérieure. De plus, l'ajout de UNSIGNED n'affecte pas la taille de la colonne, mais seulement la façon dont le nombre est affiché. représenté .

6 votes

En outre, il y a une amélioration des performances par rapport à l'index pour les cas où vous ne stockez que des valeurs non signées. Comme l'a dit @kevin-loney, cela permet de gagner du temps sur l'indexation des valeurs de la limite supérieure. Veuillez consulter le article que j'avais écrit sur l'utilisation du type non signé plutôt que signé.

3 votes

TU ES UN ROI, ROI, BRO ! Tu viens de m'épargner beaucoup de f... par la gestion ci-dessus. :-) Merci !

24voto

GeoffreyF67 Points 2728

Cela n'a pas d'importance, à moins que vous n'essayiez de tirer le meilleur parti des valeurs et que vous n'ayez pas besoin de valeurs négatives.

Par exemple, disons que vous voulez stocker 0-255.

Vous pouvez utiliser un tinyint mais seulement si vous l'utilisez comme unsigned.

Dans beaucoup de bases de données que j'ai vues, les gens ne prennent pas la peine d'optimiser comme ça et se retrouvent avec des tables plutôt grandes parce qu'ils utilisent des INT tout le temps.

Néanmoins, si vous parlez d'int par rapport à unsigned int, il n'y a aucun effet sur les performances ou l'espace disponible.

Du point de vue des normes, j'utilise toujours les valeurs non signées et je n'utilise les valeurs signées que lorsque je sais que j'aurai besoin de valeurs négatives.

19voto

Andrei Iarus Points 1019

Lorsqu'il s'agit de performances ou de stockage, c'est absolument la même chose.

En règle générale, utilisez ce qui vous convient le mieux : si vous n'avez besoin que de valeurs positives, stockez les valeurs en tant que UNSIGNED, sinon, laissez la valeur par défaut [SIGNED].

Un problème se pose lorsqu'une valeur SIGNÉE est définie pour une colonne PRIMAIRE AUTOINCREMENT : le comptage des nombres générés automatiquement commence à 1 (pas le plus petit nombre négatif) et les valeurs possibles se termineront plus tôt, car vous n'utiliserez que la moitié des valeurs. Dans ce cas (colonne PRIMAIRE + AUTOINCREMENT), il est donc préférable de stocker les données comme UNSIGNED.

10voto

ʞɔıu Points 15907

Utilisez l'option non signée lorsque la colonne ne doit contenir que des nombres positifs.

Cela n'affectera pas les performances d'E/S sur la colonne, car elle occupera toujours exactement la même quantité d'espace.

4voto

user1646191 Points 24

Cela améliorera la performance, supposons que vous vouliez rechercher la quantité < 50o.

Sans "non signé" : Déroulement du processus, puisque le champ quantité est un "int" et que vous avez un index de ce champ, MySQL définira la plage de -2147483648 à 500 et obtiendra le résultat sur la base de cette plage.

Avec "unsigned" : Déroulement du processus, puisque le champ quantité est un "int" avec "unsigned" et que vous avez un index de ce champ, MySQL définira la plage de 0 à 500 et obtiendra le résultat sur la base de cette plage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X