Quel type de données MySQL utiliser pour stocker les valeurs booléennes
-
08-07-2019 - |
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?
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>