Qui MySQL type de données à utiliser pour le stockage des valeurs booléennes
Depuis MySQL ne semble pas avoir tout 'boolean' type de données type de données ne vous "abus" pour le stockage de vrai/faux renseignements dans MySQL?
En particulier dans le contexte de l'écriture et de la lecture à partir d'un script PHP.
Au fil du temps je l'ai utilisé et vu plusieurs approches:
- tinyint, les champs varchar contenant les valeurs 0/1,
- champs varchar contenant les chaînes de caractères '0'/'1' ou "true" /"false"
- et enfin Champs de type enum contenant les deux options "vrai" /"faux".
Aucune de ce qui précède semble optimale. J'ai tendance à préférer le tinyint 0/1 variante, depuis la conversion de type automatique en PHP me donne des valeurs booléennes plutôt simplement.
Oui, de quel type de données utilisez-vous? Est-il un type conçu pour les valeurs booléennes j'ai négligé? Voyez-vous des avantages/inconvénients par l'utilisation d'un type ou d'un autre?
- Toute personne qui est à la lecture de l'ancien réponses à cette question doit comprendre que MySQL ajouté un peu de type de données dans la version 5. Utiliser les informations que vous le pouvez. dev.mysql.com/doc/refman/5.0/en/bit-type.html
- Première tinyint n'est pas un champ de type varchar comme vous l'implicite ci-dessus. Voulez-vous dire que bigint est un champ de type varchar trop? Deuxièmement, je recommande tinyint pour le stockage des champs booléens pas de raisons bien.
- Question relative à l' Alternative à beaucoup de booléens dans MySQL?
- pour la version actuelle de MYSQL de type Booléen est disponible dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html cochez cette. en fonction de cette valeur zéro considéré comme faux
- selon le cas, par exemple, pour un
deleted
drapeau sur une table de message, j'utiliseDATE NULL
, donc je peux déjà l'utiliser pour stocker la date à laquelle il a été supprimé. bit(1)
est un peu** pour importer dans Excel. Commutation detinyint(1)
œuvres.- maintenant, nous avons boolean après 5 ans
- Il y a deux demandes de fonctionnalités pour de vrai (pas de type tinyint alias) booléens, qui sont tous deux à environ 10 ans: bugs.mysql.com/bug.php?id=24530 et bugs.mysql.com/bug.php?id=24531. Je ne pouvais pas trouver un billet pour MariaDB, mais vous pouvez enregistrez-vous ici.
Vous devez vous connecter pour publier un commentaire.
Pour MySQL 5.0.3 et plus, vous pouvez utiliser
BIT
. Le manuel dit:Autrement, selon le manuel MySQL, vous pouvez utiliser le type bool et booléen qui sont pour le moment les alias de tinyint(1):
MySQL aussi que:
Références: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
!$boolean
ne sera jamais évaluer correctement, sans autre traitement.tinyint(1)
parce que, pour une raison quelconque, vous ne pouvez pas ajouter leauto_increment
attribut de la colonne si vous utilisezboolean
.auto_increment
sur une colonne représentant une valeur booléenne?I advice to avoid BIT due to problems with client libraries (which PDO issue proves). You will spare yourself a lot of trouble if you modify type of column to TINYINT(1), which will of course consume full byte of storage for every row, but according to mysql docs BIT(1) will do as well.
bit(1)
a toujours l'avantage. Ce n'est pas seulement sémantiquement correct, mais aucun n'a pu insérer accidentellement des données erronées (< 0 || >=2
) en elle. Je me demande si c'est encore plus étonnant que 5 dinosaures avaient upvoted votre commentaire, ou le fait que le ppl sera effectivement choisir d'utilisertinyint(1)
surbit(1)
pour l'amour de la plus facile de jouer avec de vieux (dans le futur) par défaut les clients.BIT
fonctionne sur phpMyAdmin, Navicat, HeidiSQL, Contrairement à d', SQLWave, Crapaud, dbForge. Je commence à sérieusement soupçonner si vous utilisez tout autre client, en plus de ceux par défaut. 3) Vous confondez les données de la sémantique avec de nommage. Ils sont parfaitement ortho..........................................................BOOL
est le mauvais choix, car elle correspond à unTINYINT
qui a2^8
machines à sous. Dans MySQL, nous avons un 2-slotbit(1)
, 256 fentebinary(1)
, et une de 256 fentetinyint
/bool
/boolean
, among........................................................................................................................true
false
sont des alias pour1
0
. Et enfin) Franchement, je suis surpris que vous êtes encore en les stockant des données booléennes à l'aide detinyint
. Pourtant, c'est un forum public, ainsi que d'un wiki. MySQL est aussi vivant hier, comme il l'est aujourd'hui et continuera de l'être dans l'avenir. Des informations trompeuses doit être abordée indépendamment de sa date ni son auteur, ou est-ce que vous ne faites pas de commentaires sur les threads juste parce que leur poste, les dates sont vieux?create table t(userid int key,a bit(1)not null,b bit(1)not null,c bit(1)not null,index(a),index b_c(b,c))engine=innodb;
et 2)explain select*from t where a=0b0;
et 3)explain select*from t where b=0b0 and c=0b1;
. Les requêtes montrent que les indices sont utilisés.BOOL
etBOOLEAN
sont synonymes deTINYINT(1)
. Le zéro estfalse
, tout le reste esttrue
. Plus d'informations ici.(1)
ne fait rien de plus que de déterminer comment la valeur est affichée, si vous êtes conscient de la taille de stockage, alors vous voulez utiliserBIT
au lieuBIT(1)
etTINYINT(1)
permettra à la fois d'utiliser un octet de stockage. Jusqu'à MySQL 5.0.3,BIT
était en fait un synonyme deTINYINT
. Plus tard, les versions de MySQL a changé la mise en œuvre de BITS. Mais même avec la mise en œuvre du changement, il n'y a toujours pas de "taille de stockage" avantage pour leBIT
type de données (au moins avec InnoDB et MyISAM; d'autres moteurs de stockage par exemple, NDB peut avoir une certaine optimisation du stockage de plusieurs BITS colonne déclarations.) Le plus gros problème est que certaines bibliothèques clientes de ne pas les reconnaître ou de les traiter correctement retournéBIT
type de données des colonnes. UnTINYINT
fonctionne mieux.true
" n'est pas vrai.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. On peut tester avec 0, ou toute expression qui s'évalue à la valeur entière 0, et aucune ligne n'est renvoyée. Si l'expression dans la clause where prend la valeur non-null entier valeur autre que zéro, l'expression est VRAIE. (Je crois décimal et les valeurs flottantes obtenir arrondie au nombre entier, par exempleWHERE 1/3
évalue àWHERE 0
. Nous obtenons le même résultat avecWHERE 'foo'
, car les chaînes de caractères'foo'
évalue également à l'entier de valeur 0.C'est une solution élégante que j'ai bien apprécier car il utilise zéro octets de données:
De l'activer, définissez
some_flag = ''
et de le mettre à false, ensemblesome_flag = NULL
.Ensuite tester pour de vrai, de vérifier si some_flag
IS NOT NULL
, et de tester pour de faux, vérifiez si some_flagIS NULL
.(Cette méthode est décrite dans "Haute Performance MySQL: Optimisation, de sauvegarde, de Réplication, et Plus" par Jon Warren Lentz, le Baron Schwartz et Arjen Lentz.)
COMMENT
dans la définition de la colonne quiNULL
indique false et''
indique true peut aller de quelques très petits chemin vers aider les futurs compréhension.Cette question a été répondu, mais j'ai pensé que je jetterais dans mon de 0,02$. J'utilise souvent un CHAR(0), où " == true et NULL == false.
De mysql docs
''
etnull
sont falsy valeurs.Si vous utilisez le type BOOLÉEN, c'est un alias de type TINYINT(1). C'est mieux si vous voulez utiliser normalisé SQL et n'avez pas l'esprit que le champ peut contenir une valeur de plage (en gros tout ce qui n'est pas 0 'true').
ENUM('Faux', 'True') vous permettra d'utiliser les chaînes dans votre SQL, MySQL va stocker le champ à l'interne comme un entier où 'False'=0 et 'True'=1 basée sur l'ordre de l'Enum est spécifié.
Dans MySQL 5+ vous pouvez utiliser un PEU(1) de champ pour indiquer un 1 bits type numérique. Je ne crois pas que cela utilise moins d'espace de stockage mais encore une fois vous permet de contraindre les valeurs 1 ou 0.
Tous les ci-dessus va utiliser environ la même quantité de stockage, il est donc préférable de choisir celui que vous trouvez le plus facile de travailler avec.
- Je utiliser TINYINT(1) afin de stocker des valeurs booléennes dans Mysql.
Je ne sais pas si il y a un avantage à utiliser ce... Mais si je ne me trompe pas, mysql peut stocker booléen (BOOL) et l'enregistrer comme un tinyint(1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
Bits n'est plus avantageux que les différents octets options (tinyint, enum, char(1)) si vous avez beaucoup de champs booléens. Un champ de bits prend toujours un octet. Deux champs de bits 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 petits, il y a des milliers d'autres optimisations, vous devriez vous concentrer sur. Sauf si vous êtes face à un énorme quantité de données, ces quelques octets ne vont pas à ajouter jusqu'à beaucoup. Si vous utilisez peu avec PHP, vous devez transtypage les valeurs et sorties.
Jusqu'à MySQL implémente un type de données bit, si votre traitement est vraiment pressé pour l'espace et/ou dans le temps, comme avec un volume élevé de transactions, de créer un TINYINT champ appelé
bit_flags
pour tous vos variables booléennes, et d'un masque et d'en confier la boolean peu que vous désirez dans votre requête SQL.Par exemple, si votre gauche bit représente votre bool champ, et les 7 bits les plus à droite représentent rien, alors votre
bit_flags
champ sera égale à 128 (binaire 10000000). Masque (masquer) les sept bits les plus à droite (à l'aide de l'opérateur au niveau du bit&
), et déplacer le 8ème bit sept espaces vers la droite, se terminant avec 00000001. Désormais, la totalité du nombre (qui, dans ce cas, est de 1) est votre valeur.Vous pouvez exécuter les instructions comme ceux-ci vous test
etc.
Puisque vous avez 8 bits, vous avez potentiellement 8 variables booléennes à partir d'un octet. L'avenir programmeur utilisent invariablement les sept bits, de sorte que vous doit masque. Ne vous contentez pas de décalage ou de vous créer un enfer pour vous-même et les autres dans le futur. Assurez-vous que vous avez MySQL ne votre de masquage et de déplacement — ce sera nettement plus rapide que d'avoir la web-langage de script (PHP, ASP, etc.) le faire. Aussi, assurez-vous que vous placez un commentaire dans la base de données MySQL champ de commentaires pour votre
bit_flags
champ.Vous trouverez ces sites utiles lors de la mise en œuvre de cette méthode:
VARCHAR
et ne le démasquage de la procédure dans le code (vous aussi n'avez pas besoin de vous limiter à des champs 8)...J'en ai eu marre d'essayer d'obtenir des zéros, les valeurs NULL, et " précisément autour d'une boucle de PHP, de MySql et de valeurs POST, donc je viens d'utiliser le 'Oui' et 'Non'.
Cela fonctionne parfaitement et n'a nul besoin d'un traitement spécial qui n'est pas évident et facile à faire.
Se référant à ce lien
Booléen le type de données dans Mysql, en fonction de l'utilisation de l'application, si l'on veut seulement 0 ou 1 pour être stocké, bit(1) est le meilleur choix.
BIT(1)
ne permettent à unb'0'
oub'1'
valeur à stocker. Le plus gros problème avecBIT
type de données est que les différentes bibliothèques clientes ont une variété de déglingués de la manipulation du type de données. La caisse du comportement dans les différents outils SQL (Contrairement à d'autres, TOAD for MySQL, SQL Developer), les outils que "désosser" modèles de base de données, et de nombreux clients, comme JDBC, PHP, Perl DBI, et pour faire bonne mesure, de test de quelques frameworks ORM (Hibernate, Mybatis, JPA). En termes de facilité d'utilisation, l'outil/cadre de compatibilité/prise en charge native,TINYINT(1)
est le gagnant clair.BIT
etTINYINT
. Reportez-vous MyBatis est JdbcType classe, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/...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 vais ne jamais l'utiliser à nouveau. Qu'il est compliqué de mon développement beaucoup, lors de l'utilisation de déclarations préparées à l'avance, les bibliothèques, etc (php).Depuis, j'utilise toujours
tinyint(1)
, semble assez bon.Depuis MySQL (8.0.16) et MariaDB (10.2.1) mis en œuvre la contrainte CHECK, je voudrais maintenant utiliser
Vous ne serez en mesure de stocker
0
,1
ouNULL
, ainsi que des valeurs qui peuvent être convertis à0
ou1
sans erreurs comme'1'
,0x00
,b'1'
ouTRUE
/FALSE
.Si vous ne souhaitez pas autoriser les valeurs Null, ajouter le
NOT NULL
optionNoter qu'il n'y a pratiquement pas de différence si vous utilisez
TINYINT
,TINYINT(1)
ouTINYINT(123)
.Si vous voulez que votre schéma pour être plus compatible, vous pouvez également utiliser
BOOL
ouBOOLEAN
db<>le violon de démonstration