Question 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 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?


990
2017-11-14 10:36


origine


Réponses:


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 le bit-field   valeurs. Un type de BIT (M) permet le stockage des valeurs de M bits. M peut varier   de 1 à 64.

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

Bool, Boolean: Ces types sont synonymes de TINYINT(1). Une valeur de   zéro est considéré comme faux. Non-zéro   les valeurs sont considérées comme vraies.

MySQL déclare également que:

Nous avons l'intention d'implémenter un booléen complet   manipulation de type, conformément à   SQL standard, dans un futur MySQL   Libération.

Les références: http://dev.mysql.com/doc/refman/5.5/fr/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.


1064
2017-11-14 10:50



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


200
2017-11-14 10:55



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 définir sur true, définissez some_flag = '' et pour le définir sur false, réglez some_flag = NULL.

Ensuite, pour tester true, vérifiez si some_flag 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.)


64
2018-02-10 18:09



Cette question a été répondue mais je me suis dit que je mettrais mon $ 0.02. J'utilise souvent un CHAR (0), où '' == true et NULL == false.

De mysql docs

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


32
2018-04-30 17:39



Si vous utilisez le type BOOLEAN, il est associé à TINYINT (1). Ceci est préférable 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 .

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


28
2017-11-14 14:59



J'utilise TINYINT (1) pour stocker des valeurs booléennes dans Mysql.

Je ne sais pas s'il y a un avantage à utiliser ça ... Mais si je ne me trompe pas, mysql peut stocker boolean (BOOL) et le stocker comme tinyint (1)

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html


16
2017-11-14 10:42



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.


14
2018-01-12 16:18



Jusqu'à ce que MySQL implémente un type de données bit, si votre traitement est vraiment pressé pour l'espace et / ou le temps, comme avec des transactions à volume élevé, créez un champ TINYINT appelé bit_flags pour toutes vos variables booléennes, masquez et déplacez le bit booléen que vous désirez 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 bit_flags Le champ sera égal à 128 (binaire 10000000). Masquer (masquer) les sept bits les plus à droite (en utilisant l'opérateur bitwise &), et déplacez le huitième bit de sept espaces vers la droite, pour finir avec 00000001. Maintenant, le nombre entier (qui, dans ce cas, 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 doit masque. 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 effectue le masquage et le transfert - ce qui sera nettement plus rapide que d'utiliser le langage de script Web (PHP, ASP, etc.). Assurez-vous également de placer un commentaire dans le champ de commentaire MySQL pour votre bit_flags champ.

Vous trouverez ces sites utiles lors de l'implémentation de cette méthode:


12
2017-07-13 17:13



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.


9
2017-07-09 20:10