8
votes

Enum ou Bool dans MySQL?

Question simple idiote. Quoi de mieux?

un bool ou un énumé ('y', 'n')?


1 commentaires

Définir «mieux»?


7 Réponses :


6
votes

tinyint (1) - il ressemble à un booléen, alors faites-en un.

Ne comparez jamais à l'intérieur à des choses comme y quand un booléen (0/1) est disponible.


0 commentaires

19
votes

Boolean est un alias pour Tinyint (1) et est stocké comme un octet de données.
Enum ('Y', 'n') est également stocké sous forme de 1 octets de données.

Donc, d'un point de vue de taille de stockage, ni meilleur.
Cependant, vous pouvez stocker 9 dans un champ booléen et cela l'acceptera. Donc, si vous voulez forcer deux États seulement, allez pour Enum.


3 commentaires

Il n'est vraiment pas question d'utiliser un Enum . Tinyint est meilleur que l'un ou l'autre boolean ou Enum quand tout ce que vous voulez est un vrai / faux.


Comme je l'ai mentionné, vous pouvez facilement stocker 9 dans un champ booléen. Cela dit, 9 évalue en vrais dans un bon nombre de langues, mais pas dans MySQL (où vrais est simplement un alias pour 1)


Qu'en est-il d'utiliser un peu (1)? Cela devrait forcer les valeurs à 0 et 1



0
votes

Selon la langue que vous utilisez pour interface avec la base de données, vous pouvez exécuter des problèmes de sensibilité en utilisant Enum, par exemple si votre base de données utilise un 'Y' minuscule, mais votre code s'attend à une "Y" majuscule. Un Bool / Tinyint sera toujours 0 ou 1 (ou NULL) afin qu'il évite ce problème.


1 commentaires

Ceci est une erreur. Un bool , booléen ou tinyint peut contenir des valeurs autres que 0 , 1 ou null . Un Tinyint (1) est un octet , pas un bit. Il peut stocker des valeurs de -127 à 127 (ou de 0 à 255 si non signé).



7
votes

Voici le problème de stocker des valeurs booléennes comme une énorme:

Sélectionnez le nombre (*) des personnes où is_active = true; # => retourne 0 car true! = 'vrai'

qui est trompeur parce que:

Sélectionnez Count (*) des personnes où is_active = 'true'; # => retourne 10

Si vous écrivez toutes vos propres requêtes SQL, vous sauriez alors de ne pas transmettre une expression dans votre requête, mais si vous utilisez un orm, vous allez courir dans des ennuis depuis un ormes généralement Convertissez l'expression à quelque chose que la base de données qu'il demande peut comprendre ('T' / 'F' pour SQLite; 0/1 pour MySQL, etc.)

En bref, tandis que l'on peut ne pas être plus rapide que l'autre au niveau des octets, les booléens doivent être stockés comme des expressions afin de pouvoir être comparées à d'autres expressions.

au moins, c'est comme ça que je le vois.


0 commentaires

2
votes

ne sont pas les meilleurs pour stocker un seul bit (ou booléen). L'ENUM a une table de recherche et stocke la réponse comme un entier. Le booléen est en réalité un alias pour "Tinyint (1)" qui est techniquement de 8 bits d'information. Le type de données de bits ne stockera que autant de bits que dans sa définition (comme dans le type varchar), donc un bit (1) ne stockera littéralement qu'un seul bit. Toutefois, si vous n'avez que l'un de ces champs, alors la question est discutable, car rien ne remplira les bits restants, ils seront donc un espace inutilisé sur chaque rangée (quantité d'espace que chaque rangée est arrondi au moins un octet, typiquement 8 bits, par rangée).


1 commentaires

Comme il s'agit d'un entier, avec les valeurs 0 et 1, il peut également être utilisé dans des comparaisons, c'est-à-dire faux et vrai



1
votes

Beaucoup d'averves par défaut consiste à utiliser bool / tinyint (1) , mais comme indiqué dans la réponse à https://stackoverflow.com/a/4180982/2045006 Cela permet de 9 variantes de true .

Dans de nombreux cas, cela n'a pas d'importance, mais si votre colonne fera partie d'un index unique, cela deviendra tout à fait un problème.

Dans le cas où vous utiliserez la colonne d'un index unique, je vous recommanderais d'utiliser bit (1) . .

Enum fonctionnerait également bien avec un index unique (à condition que vous disposiez d'un ensemble de mode SQL approprié.) Cependant, j'utiliserais Enum uniquement lorsque vous souhaitez travailler avec des représentations de chaîne de Vrai / Faux plutôt que les valeurs booléennes réelles.


0 commentaires

-2
votes

Il y a 8 Raisons pour n'utiliser pas Enum Type de données;
Ainsi, au lieu d'énum, ​​utilisez booléen ou une table étrangère . .


0 commentaires