Question

Puisque MySQL ne semble pas avoir de type de données "booléen", quel type de données utilisez-vous pour "abuser" du stockage d'informations vraies ou fausses dans MySQL?

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

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

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

Aucune de ces réponses ne semble optimale. J'ai tendance à préférer la variante tinyint 0/1, car la conversion automatique de types en PHP me donne des valeurs booléennes plutôt simplement.

Alors quel type de données utilisez-vous? Existe-t-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?

Était-ce utile?

La solution

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 des champs de bits.   valeurs. Un type de 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 actuellement les alias de tinyint (1):

  

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

MySQL indique également que:

  

Nous avons l’intention de mettre en œuvre des booléens complets   type de manutention, conformément à   SQL standard, dans un futur MySQL   relâchez.

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

Autres conseils

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

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 sur False, sur some_flag = NULL.

Ensuite, pour tester la valeur true, vérifiez si certains_flag IS NOT NULL et pour rechercher la valeur false, vérifiez si certains_flag IS NULL.

(Cette méthode est décrite dans & "MySQL hautes performances: optimisation, sauvegardes, réplication, etc." par Jon Warren Lentz, Baron Schwartz et Arjen Lentz.)

On a répondu à cette question, mais je me suis dit que je mettrais 0,02 $. J'utilise souvent un CHAR (0), où '' == true et NULL == false.

De la documentation mysql

  

CHAR (0) est également très utile lorsque vous avez besoin d’une colonne ne pouvant contenir que   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).

Si vous utilisez le type BOOLEAN, il est associé à TINYINT (1). C’est mieux si vous voulez utiliser du SQL normalisé et que le champ peut contenir une valeur hors limites (en principe, tout ce qui n’est pas 0 sera «vrai»).

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

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

Tous les éléments ci-dessus utilisent environ la même quantité d'espace de stockage. Il est donc préférable de choisir celui qui vous convient le mieux.

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

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

http: //dev.mysql. com / doc / refman / 5.0 / fr / autre-fournisseur-data-types.html

Bit n’est avantageux que pour les différentes options d’octets (tinyint, enum, char (1)) si vous avez beaucoup de champs booléens. Un champ de bits occupe toujours un octet complet. Deux champs de bits entrent dans 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 faibles que vous devriez vous concentrer sur des milliers d’optimisations supplémentaires. À moins que vous ne traitiez une quantité énorme de données, ces quelques octets ne vous rapporteront pas grand chose. Si vous utilisez bit avec PHP, vous devez convertir les valeurs entrantes et sortantes.

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 pour les transactions de volume élevé, créez un champ TINYINT appelé bit_flags pour toutes vos variables booléennes, masquez et déplacez le booléen. peu 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, votre champ & sera égal à 128 (valeur binaire 10000000). Masque (masque) les sept bits les plus à droite (à l’aide de l’opérateur binaire <=>), et décale le huitième bit de sept espaces vers la droite pour aboutir à 00000001. 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 telles que celles-ci lorsque vous testez

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

etc.

Puisque vous avez 8 bits, vous avez potentiellement 8 variables booléennes d’un octet. Les futurs programmeurs utiliseront invariablement les sept bits suivants, vous devez donc masquer . Don & # 8217; Ne vous contentez pas de passer, ou vous allez créer un enfer pour vous-même et les autres à l'avenir. Assurez-vous que MySQL masque et déplace & # 8212; cela sera beaucoup plus rapide que si le langage de script Web (PHP, ASP, etc.) le faisait. Assurez-vous également de placer un commentaire dans le champ de commentaire MySQL pour votre <=> champ.

Vous & # 8217; Ces sites vous seront utiles lors de l’implémentation de cette méthode:

J'en avais marre d'essayer d'obtenir des zéros, des NULLS, et '' de contourner avec précision une boucle de PHP, MySql et les valeurs POST, donc je viens d'utiliser 'Oui' et 'Non'.

Cela fonctionne parfaitement et ne nécessite aucun traitement spécial, ni évident ni facile à faire.

En référence à ce lien      type de données booléen dans Mysql , selon le utilisation de l’application, si l’on souhaite que seuls 0 ou 1 soient stockés, le meilleur choix est le bit (1).

Après avoir lu les réponses ici, j’ai décidé d’utiliser bit(1) et oui, c’est mieux dans l’espace / le temps, MAIS , après un moment, j’ai changé d’avis et je ne l’utiliserai plus jamais. Cela a beaucoup compliqué mon développement lorsque j'utilise des instructions préparées, des bibliothèques, etc. (php).

Depuis lors, j’utilise toujours tinyint(1), cela semble suffisant.

Etant donné que MySQL (8.0.16) et MariaDB (10.2.1) implémentaient tous les deux la contrainte CHECK, je voudrais maintenant utiliser

.
bool_val TINYINT CHECK(bool_val IN(0,1))

Vous ne pourrez stocker que 0, 1 ou NULL, ainsi que des valeurs pouvant être converties en '1' ou 0x00 sans erreurs telles que b'1', TRUE, < => ou FALSE / NOT NULL.

Si vous ne souhaitez pas autoriser les valeurs NULL, ajoutez l'option TINYINT

.
bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

Notez qu'il n'y a pratiquement aucune différence si vous utilisez TINYINT(1), TINYINT(123) ou BOOL.

Si vous souhaitez que votre schéma soit compatible vers le haut, vous pouvez également utiliser BOOLEAN ou <=>

.
bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

/ a>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top