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 cadre de l'écriture et de la lecture de / 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 «vrai» / «faux».
Rien de ce qui précède ne semble optimal. J'ai tendance à préférer la variante tinyint 0/1, car la conversion automatique de type en PHP me donne des valeurs booléennes assez simplement.
Alors, quel type de données utilisez-vous? Existe-t-il un type conçu pour les valeurs booléennes que j'ai négligé? Voyez-vous des avantages / inconvénients en utilisant un type ou un autre?
mysql
boolean
sqldatatypes
Peter Mortensen
la source
la source
bit(1)
est un peu ** à importer dans Excel. Passer auxtinyint(1)
travaux.Réponses:
Pour MySQL 5.0.3 et supérieur, vous pouvez utiliser
BIT
. Le manuel dit:Sinon, selon le manuel MySQL, vous pouvez utiliser bool et boolean qui sont actuellement des alias de tinyint (1):
MySQL déclare également que:
Références: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
la source
!$boolean
il ne sera jamais évalué correctement sans traitement supplémentaire.auto_increment
une colonne représentant une valeur booléenne?BOOL
etBOOLEAN
sont synonymes deTINYINT(1)
. Zérofalse
, tout le restetrue
. Plus d'informations ici .la source
(1)
ne fait rien de plus que de déterminer comment la valeur est affichée, si vous êtes conscient de la taille du stockage, vous souhaitez utiliser à laBIT
placeBIT(1)
etTINYINT(1)
utiliseront tous les deux un octet de stockage. Jusqu'à MySQL 5.0.3,BIT
était en fait synonyme deTINYINT
. Les versions ultérieures de MySQL ont changé l'implémentation de BIT. Mais même avec le changement d'implémentation, il n'y a toujours aucun avantage de "taille de stockage" pour leBIT
type de données (au moins avec InnoDB et MyISAM; d'autres moteurs de stockage, par exemple NDB, peuvent avoir une optimisation de stockage pour plusieurs déclarations de colonnes BIT.) Le plus gros problème est que certains clients les bibliothèques ne reconnaissent pas ou ne gèrent pas correctement lesBIT
colonnes de type de données renvoyées . UnTINYINT
fonctionne mieux.true
" n'est pas vraie.SELECT 'foo' AS bar FROM dual WHERE -7
. L'expression -7 est évaluée dans un contexte booléen et la requête renvoie une ligne. Nous pouvons tester avec 0, ou n'importe quelle expression qui évalue à la valeur entière 0, et aucune ligne n'est retournée. Si l'expression dans la clause WHERE est évaluée à n'importe quelle valeur entière non nulle autre que zéro, l'expression est TRUE. (Je crois que les valeurs décimales et flottantes sont "arrondies" à un entier, par exemple,WHERE 1/3
évaluées àWHERE 0
. Nous obtenons le même résultat avecWHERE 'foo'
, car la chaîne est'foo'
également évaluée à la valeur entière 0.C'est une solution élégante que j'apprécie tout à fait car elle utilise zéro octet de données:
Pour le définir sur true, définissez
some_flag = ''
et pour le définir sur false, définissezsome_flag = NULL
.Ensuite, pour tester true, vérifiez si some_flag
IS NOT NULL
et pour tester false, vérifiez if some_flagIS 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.)
la source
COMMENT
dans la définition de la colonne quiNULL
indique faux et''
indique vrai pourrait contribuer très peu à faciliter la compréhension future.Si vous utilisez le type BOOLEAN, celui-ci a pour alias TINYINT (1). C'est mieux si vous voulez utiliser du SQL standardisé et que cela ne vous dérange pas que le champ puisse contenir une valeur hors limites (fondamentalement 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 en fonction de l'ordre dans lequel l'énumération est spécifiée .
Dans MySQL 5+, vous pouvez utiliser un champ BIT (1) pour indiquer un type numérique à 1 bit. Je ne pense pas que cela utilise réellement moins d'espace dans le stockage, mais vous permet à nouveau de contraindre les valeurs possibles à 1 ou 0.
Tout ce qui précède utilisera environ la même quantité de stockage, il est donc préférable de choisir celui avec lequel vous trouvez le plus facile à travailler.
la source
Cette question a reçu une réponse, mais je pensais que je mettrais mes 0,02 $. J'utilise souvent un
CHAR(0)
, où'' == true and NULL == false
.Depuis les documents mysql :
la source
''
etnull
sont des valeurs fausses.J'utilise TINYINT (1) afin de stocker des valeurs booléennes dans Mysql.
Je ne sais pas s'il y a un avantage à l'utiliser ... Mais si je ne me trompe pas, mysql peut stocker des booléens (BOOL) et les stocker sous forme de minuscule (1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
la source
Bit n'est avantageux sur les différentes options d'octets (tinyint, enum, char (1)) que si vous avez beaucoup de champs booléens. Un champ de bits occupe 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 faibles qu'il y a des milliers d'autres optimisations sur lesquelles vous devriez vous concentrer. À moins que vous n'ayez à traiter une énorme quantité de données, ces quelques octets n'apporteront pas grand-chose. Si vous utilisez Bit avec PHP, vous devez transtyper les valeurs entrant et sortant.
la source
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, et masquez et déplacez le bit booléen que vous désirez dans votre SQL requete.Par exemple, si votre bit le plus à gauche représente votre champ booléen et les 7 bits les plus à droite ne représentent rien, votre
bit_flags
champ sera égal à 128 (binaire 10000000). Masquez (masquez) les sept bits les plus à droite (à l'aide de l'opérateur au niveau du bit&
) et déplacez le 8e bit de sept espaces vers la droite, pour finir avec 00000001. Maintenant, le nombre entier (qui, dans ce cas, est 1) est votre valeur.Vous pouvez exécuter des instructions comme celles-ci pendant que vous testez
etc.
Puisque vous avez 8 bits, vous avez potentiellement 8 variables booléennes d'un octet. Certains futurs programmeurs utiliseront invariablement les sept bits suivants, vous devez donc masquer. Ne vous contentez pas de changer, ou vous créerez l'enfer pour vous et les autres à l'avenir. Assurez-vous que MySQL fait votre masquage et votre déplacement - ce sera beaucoup plus rapide que de le faire avec le langage de script Web (PHP, ASP, etc.). Assurez-vous également de placer un commentaire dans le champ de commentaire MySQL de votre
bit_flags
champ.Vous trouverez ces sites utiles lors de la mise en œuvre de cette méthode:
la source
VARCHAR
et effectuez la procédure de démasquage dans le code (vous n'avez pas non plus besoin de le limiter à 8 champs) ...BIT
type existe. Voir dev.mysql.com/doc/refman/8.0/en/bit-type.htmlJ'en ai eu marre d'essayer d'obtenir des zéros, des NULLS et '' d'arrondir avec précision une boucle de valeurs PHP, MySql et POST, donc j'utilise simplement 'Oui' et 'Non'.
Cela fonctionne parfaitement et ne nécessite aucun traitement spécial qui n'est pas évident et facile à faire.
la source
En se référant à ce lien de type de données booléen dans Mysql , selon l'utilisation de l'application, si l'on veut que seulement 0 ou 1 soit stocké, le bit (1) est le meilleur choix.
la source
BIT(1)
seul unb'0'
ou uneb'1'
valeur sera stockée. Le plus gros problème avec leBIT
type de données est que diverses bibliothèques clientes ont une variété de manipulations louches du type de données. Découvrez le comportement de divers outils SQL (SQLyog, TOAD for MySQL, SQL Developer), des outils qui «désossent» les modèles de base de données et divers clients, comme JDBC, PHP, Perl DBI, et pour faire bonne mesure, testez quelques cadres ORM ( Hibernate, Mybatis, JPA). En termes de facilité d'utilisation, la compatibilité outil / framework / support natifTINYINT(1)
est clairement gagnante.BIT
etTINYINT
. Référez-vous à la classe JdbcType de MyBatis, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…Puisque MySQL (8.0.16) et MariaDB (10.2.1) ont tous deux implémenté la contrainte CHECK, j'utiliserais maintenant
Vous ne serez en mesure de stocker
0
,1
ouNULL
, ainsi que les valeurs qui peuvent être convertis en0
ou1
sans erreurs comme'1'
,0x00
,b'1'
ouTRUE
/FALSE
.Si vous ne souhaitez pas autoriser les valeurs NULL, ajoutez l'
NOT NULL
optionNotez qu'il n'y a pratiquement aucune différence si vous utilisez
TINYINT
,TINYINT(1)
ouTINYINT(123)
.Si vous souhaitez que votre schéma soit compatible vers le haut, vous pouvez également utiliser
BOOL
ouBOOLEAN
démo db <> violon
la source
ENUM
(ça doit êtreenum('0', '1')
- note: ce sont des cordes) n'est pas une bonne idée. Il y a trop de problèmes en raison de la façon dont il est stocké en interne et de la façon dont les valeurs non-chaîne sont traitées. Par exemple.0
etFALSE
ne peut pas être stocké.1
etTRUE
devenir'0'
. Et2
devient'1'
.Après avoir lu les réponses ici, j'ai décidé d'utiliser
bit(1)
et oui, c'est en quelque sorte mieux dans l'espace / temps, MAIS après un certain temps j'ai changé d'avis et je ne l'utiliserai plus jamais. Cela a beaucoup compliqué mon développement, lors de l'utilisation d'instructions préparées, de bibliothèques, etc. (php).Depuis lors, j'utilise toujours
tinyint(1)
, semble assez bon.la source
Vous pouvez utiliser le type de données BOOL, BOOLEAN pour stocker des valeurs booléennes.
Cependant, le type de données BIT (1) a plus de sens pour stocker une valeur booléenne (soit vrai [1] ou faux [0]) mais TINYINT (1) est plus facile à utiliser lorsque vous sortez les données, interrogez, etc. sur et pour réaliser l'interopérabilité entre MySQL et d'autres bases de données. Vous pouvez également vérifier cette réponse ou ce fil .
De plus, lisez la documentation
la source