1332 votes

Quel type de données MySQL utiliser pour stocker les valeurs booléennes ?

Puisque MySQL ne semble pas avoir de type de données "booléen", quel type de données utilisez-vous pour stocker des informations vrai/faux dans MySQL ? Surtout dans le contexte de l'écriture et de la lecture d'un script PHPscript.

Au fil du temps, j'ai utilisé et vu plusieurs approches :

  • champs tinyint, varchar contenant les valeurs 0/1,
  • champs varchar contenant les chaînes '0'/'1' ou 'true'/'false'.
  • et enfin enum Fields contenant les deux options 'true'/'false'.

Aucune des variantes ci-dessus ne semble optimale, j'ai tendance à préférer la variante tinyint 0/1, puisque la conversion automatique des types en PHP me donne des valeurs booléennes assez simplement.

Quel type de données utilisez-vous ? Existe-t-il un type conçu pour les valeurs booléennes que j'ai négligé ? Voyez-vous des avantages/inconvénients à utiliser un type ou un autre ?

1331voto

markus Points 22871

Pour MySQL 5.0.3 et plus, vous pouvez utiliser BIT . Le manuel dit :

Depuis MySQL 5.0.3, le type de données BIT est utilisé pour stocker les valeurs des champs de bits. valeurs de champs de bits. Un type BIT(M) permet de stocker des valeurs de M bits. M peut aller de 1 à 64.

Sinon, selon le manuel MySQL, vous pouvez utiliser bool et boolean qui sont pour l'instant des alias de tinyint(1) :

Bool, booléen : Ces types sont des synonymes de TINYINT(1). Une valeur de zéro est considérée comme fausse. Les valeurs non nulles de sont considérées comme vraies.

MySQL déclare également que :

Nous avons l'intention d'implémenter la gestion complète des types booléens conformément à la norme SQL standard, dans une future version de MySQL dans une future version.

BTW : c'est juste une question de http://www.google.ch/search?q=mysql+booléen+datype .

C'est drôle, n'est-ce pas, ce lien, posté il y a quelques années, est devenu récursif.

278voto

Philip Morton Points 24913

BOOL et BOOLEAN sont des synonymes de TINYINT(1) . Zéro est false tout le reste est true . Plus d'informations ici .

76voto

R. S. Points 485

Il s'agit d'une solution élégante que j'apprécie beaucoup car elle n'utilise aucun octet de données :

some_flag CHAR(0) DEFAULT NULL

Pour le définir comme vrai, définissez some_flag = '' et pour le mettre à faux, mettez some_flag = NULL .

Ensuite, pour tester si c'est vrai, vérifiez si some_flag IS NOT NULL et pour tester si c'est faux, vérifiez si some_flag IS NULL .

(Cette méthode est décrite dans "High Performance MySQL : Optimization, Backups, Replication, and More" par Jon Warren Lentz, Baron Schwartz et Arjen Lentz).

Je viens de réaliser qu'il y a une réponse à -2 votes déjà postée avec la même solution. Je supprimerais bien cette réponse mais je ne vois pas d'option pour le faire. Je ne suis pas non plus d'accord avec les votes négatifs car je trouve que c'est une très bonne solution.

41voto

Josh Points 7132

On a déjà répondu à cette question, mais je me suis dit que j'allais apporter mon grain de sel. J'utilise souvent un CHAR(0), où '' == vrai et NULL == faux.

De docs mysql

CHAR(0) est également très utile lorsque vous avez besoin d'une colonne qui peut prendre seulement deux valeurs : Une colonne définie comme CHAR(0) NULL n'occupe qu'un seul bit et ne peut prendre que les valeurs NULL et ''. bit et ne peut prendre que les valeurs NULL et '' (la chaîne vide).

34voto

Ciaran McNulty Points 10503

Si vous utilisez le type BOOLEAN, il est remplacé par TINYINT(1). C'est la meilleure solution si vous souhaitez utiliser un langage SQL standardisé et si vous ne craignez pas que le champ puisse contenir une valeur hors limites (en fait, tout ce qui n'est pas égal à 0 sera considéré comme "vrai").

ENUM('False', 'True') vous permettra d'utiliser les chaînes de caractères dans votre SQL, et MySQL stockera le champ en interne sous forme d'un nombre entier où 'False'=0 et 'True'=1 en fonction de l'ordre dans lequel l'Enum est spécifié.

Dans MySQL 5+, vous pouvez utiliser un champ BIT(1) pour indiquer un type numérique à 1 bit. Je ne pense pas que cela utilise moins d'espace de stockage, mais cela vous permet de limiter les valeurs possibles à 1 ou 0.

Toutes les options ci-dessus utilisent à peu près la même quantité de stockage, il est donc préférable de choisir celle qui vous semble la plus facile à utiliser.

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