mysql - type - tinyint boolean




Quel type de données MySQL utiliser pour stocker les valeurs booléennes (7)

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.

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?


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.)



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.


Jusqu'à ce que MySQL implémente un type de données bit, si vous travaillez réellement sur l'espace et / ou le temps, par exemple avec des transactions à volume élevé, créez un champ TINYINT appelé bit_flags, pour toutes vos variables booléennes et masquez et déplacez le bit booléen. désir dans votre requête SQL.

Par exemple, si votre bit le plus à gauche représente votre champ booléen et que les 7 bits les plus à droite ne représentent rien, alors votre champ bit_flags sera égal à 128 (binaire 10000000). Masquer (cacher) les sept bits les plus à droite (en utilisant l'opérateur bit &), et décaler le huitième bit de sept espaces vers la droite, pour finir par 00000001. Maintenant, le nombre entier (qui est 1) est votre valeur.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;
if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

Vous pouvez exécuter des instructions comme celles-ci pendant le test

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

etc...

Puisque vous avez 8 bits, vous avez potentiellement 8 variables booléennes, d'un octet. Un futur programmeur utilisera invariablement les sept bits suivants, donc vous DEVEZ masquer. Ne changez pas seulement, ou vous allez créer l'enfer pour vous-même et pour les autres à l'avenir. Assurez-vous que MySQL fait le masquage et le changement de vitesse - sera plus rapide que d'avoir le langage de script web (PHP, ASP, etc ...) le faire. Veillez également à placer un commentaire dans le champ de commentaire MySQL pour votre champ bit_flags.

Vous trouverez ces sites utiles lors de l'implémentation de cette méthode. http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html


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.


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







sqldatatypes