boolean server - Quel type de données MySQL utiliser pour stocker les valeurs booléennes




default phpmyadmin (9)

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

Puisque MySQL ne semble pas avoir de type de données 'booléen', quel type de données abusez-vous pour stocker des informations vraies / fausses dans MySQL?

Surtout dans le contexte de l'écriture et de la lecture de / vers un script PHP.

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

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

Rien de ce qui précède ne semble optimal. J'ai tendance à préférer la variante tinyint 0/1, puisque la conversion de type automatique en PHP me donne des valeurs booléennes plutôt simplement.

Alors quel type de données utilisez-vous? Y at-il un type conçu pour les valeurs booléennes que j'ai oublié? Voyez-vous des avantages / inconvénients en utilisant un type ou un autre?


Si vous utilisez le type BOOLEAN, il est associé à TINYINT (1). C'est mieux si vous voulez utiliser du SQL standardisé et que le champ peut contenir une valeur hors de la plage (tout ce qui n'est pas 0 sera "vrai").

ENUM ('False', 'True') vous permettra d'utiliser les chaînes dans votre SQL, et MySQL stockera le champ en interne sous la forme d'un entier où 'False' = 0 et 'True' = 1 selon l'ordre spécifié par Enum .

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

Tout ce qui précède utilisera à peu près la même quantité de stockage, il est donc préférable de choisir celui qui vous semble le plus facile à utiliser.



J'en ai marre d'essayer d'obtenir des zéros, NULLS, et '' tournez avec précision une boucle de valeurs PHP, MySql et POST, donc j'utilise simplement 'Oui' et 'Non'.

Cela fonctionne parfaitement et n'a pas besoin d'un traitement spécial qui n'est pas évident et facile à faire.


Pour MySQL 5.0.3 et supérieur, 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. Un type de BIT (M) permet le stockage des valeurs de M bits. M peut aller de 1 à 64.

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

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

MySQL déclare également que:

Nous avons l'intention d'implémenter le traitement de type booléen complet, conformément au standard SQL, dans une future version de MySQL.

Références: dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

BTW: c'est juste une question de https://google.com/search?q=mysql+boolean+datatype .

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


C'est une solution élégante que j'apprécie beaucoup car elle utilise zéro octet de données:

some_flag CHAR(0) DEFAULT NULL

Pour le mettre à true, mettez un some_flag = '' nombre de some_flag = '' et pour le mettre à false, mettez un some_flag = NULL nombre de some_flag = NULL .

Ensuite, pour tester true, vérifiez si some_flag n'est IS NOT NULL et pour tester false, vérifiez si some_flag IS NULL .

(Cette méthode est décrite dans "MySQL haute performance: optimisation, sauvegardes, réplication et plus" par Jon Warren Lentz, Baron Schwartz et Arjen Lentz.)



Bit est seulement avantageux sur les diverses options d'octets (tinyint, enum, char (1)) si vous avez beaucoup de champs booléens. Un champ bit prend toujours un octet complet. Deux champs de bits correspondent à ce même octet. Trois, quatre, cinq, six, sept, huit. Après quoi ils commencent à remplir l'octet suivant. En fin de compte les économies sont si petites, il y a des milliers d'autres optimisations sur lesquelles vous devriez vous concentrer. À moins que vous n'ayez à gérer une énorme quantité de données, ces quelques octets ne vont pas ajouter grand chose. Si vous utilisez bit avec PHP, vous devez typer les valeurs entrant et sortant.


Dans ubuntu besoin de décommenter cette ligne dans php.ini qui se trouve à /etc/php/7.0/apache2/php.ini

extension = php_mysqli.so





mysql boolean sqldatatypes