Boolean vs tinyint (1) pour les valeurs booléennes dans MySQL
124
Quel type de colonne est préférable d'utiliser dans une base de données MySQL pour les valeurs booléennes? J'utilise booleanmais mon collègue utilise tinyint(1).
Il semble que MySQL traite de booleanmanière transparente comme tinyint(1). Ainsi, vous pouvez utiliser boolean, trueet falseet MySQL les traite comme tinyint(1), 1et 0.
ADTC
Un autre cas est le caractère 1 avec Y & N qui est censé être plus rapide par certaines personnes.
Je ne dirais pas que les types de données sont des synonymes - tinyint (1) est identique à bool, mais tinyint et bool ne sont pas identiques. Point mineur, mais votre réponse m'a fait trébucher la première fois que je l'ai lu
Kyle Chadha
2
Cela ne répond pas à la question. S'il est vrai que tinyint (1) est fonctionnellement identique à bool, l'OP a demandé ce qu'il était préférable d'utiliser. La réponse de @dj_segfault fait un bon travail expliquant pourquoi bool devrait être préféré à tinyint (1) lors du stockage d'une valeur booléenne.
Kyle Morgan
88
Je vais adopter une approche différente ici et suggérer qu'il est tout aussi important pour vos collègues développeurs de comprendre votre code que pour le compilateur / base de données. L'utilisation de boolean peut faire la même chose que l'utilisation de tinyint, mais elle a l'avantage de transmettre sémantiquement votre intention, et cela vaut quelque chose.
Si vous utilisez un tinyint, il n'est pas évident que les seules valeurs que vous devriez voir sont 0 et 1. Un booléen est TOUJOURS vrai ou faux.
Personnellement, je suggérerais d'utiliser tinyint comme préférence, car boolean ne fait pas ce que vous pensez qu'il fait à partir du nom, ce qui rend le code potentiellement trompeur. Mais d'un point de vue pratique, cela n'a vraiment pas d'importance - ils font tous les deux la même chose, donc vous ne gagnez ni ne perdez rien en utilisant l'un ou l'autre.
utiliser enum c'est le plus simple et le plus rapide
Je ne recommanderai pas enum ou tinyint (1) car le bit (1) n'a besoin que de 1 bit pour stocker la valeur booléenne tandis que tinyint (1) a besoin de 8 bits.
Nous ne pouvons pas utiliser enum car notre base de données doit également prendre en charge sqlite
tom
11
Si vous utilisez InnoDB, bit finit par utiliser autant d'espace que tinyint. De MySQL haute performance (les gars de percona) "InnoDB stocke chaque colonne [bit] comme le plus petit type entier suffisamment grand pour contenir les bits, donc vous n'économisez pas d'espace de stockage." Le seul gain est si vous stockez plusieurs valeurs booléennes dans une colonne BIT (plus de 1). Donc, si vous n'avez qu'un seul champ booléen, l'utilisation de tinyint est la même chose que bit dans InnoDB, et est préférable car tinyint est généralement plus facile à utiliser.
Il est vrai que boolet tinyint(1)sont fonctionnellement identiques, booldevrait être l'option préférée , car elle porte le sens sémantique de ce que vous essayez de faire. De plus, de nombreux ORM seront convertis boolen type booléen natif de votre langage de programmation.
Mon expérience en utilisant Dapper pour se connecter à MySQL est que cela compte . J'ai changé un bit non nullable (1) en un tinyint nullable (1) en utilisant le script suivant:
ALTERTABLE TableName MODIFY Setting BOOLEAN null;
Puis Dapper a commencé à lancer des exceptions. J'ai essayé de regarder la différence avant et après le script. Et j'ai remarqué que le bit (1) était devenu tinyint (1).
boolean
manière transparente commetinyint(1)
. Ainsi, vous pouvez utiliserboolean
,true
etfalse
et MySQL les traite commetinyint(1)
,1
et0
.Réponses:
Ces types de données sont des synonymes.
la source
Je vais adopter une approche différente ici et suggérer qu'il est tout aussi important pour vos collègues développeurs de comprendre votre code que pour le compilateur / base de données. L'utilisation de boolean peut faire la même chose que l'utilisation de tinyint, mais elle a l'avantage de transmettre sémantiquement votre intention, et cela vaut quelque chose.
Si vous utilisez un tinyint, il n'est pas évident que les seules valeurs que vous devriez voir sont 0 et 1. Un booléen est TOUJOURS vrai ou faux.
la source
boolean
n'est pas un type de données distinct dans MySQL; c'est juste un synonyme detinyint
. Voir cette page dans le manuel MySQL .Personnellement, je suggérerais d'utiliser tinyint comme préférence, car boolean ne fait pas ce que vous pensez qu'il fait à partir du nom, ce qui rend le code potentiellement trompeur. Mais d'un point de vue pratique, cela n'a vraiment pas d'importance - ils font tous les deux la même chose, donc vous ne gagnez ni ne perdez rien en utilisant l'un ou l'autre.
la source
utiliser enum c'est le plus simple et le plus rapide
Je ne recommanderai pas enum ou tinyint (1) car le bit (1) n'a besoin que de 1 bit pour stocker la valeur booléenne tandis que tinyint (1) a besoin de 8 bits.
réf
TINYINT vs ENUM (0, 1) pour les valeurs booléennes dans MySQL
la source
BIT(M) - approximately (M+7)/8 bytes
voir: dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlIl est vrai que
bool
ettinyint(1)
sont fonctionnellement identiques,bool
devrait être l'option préférée , car elle porte le sens sémantique de ce que vous essayez de faire. De plus, de nombreux ORM seront convertisbool
en type booléen natif de votre langage de programmation.la source
Mon expérience en utilisant Dapper pour se connecter à MySQL est que cela compte . J'ai changé un bit non nullable (1) en un tinyint nullable (1) en utilisant le script suivant:
Puis Dapper a commencé à lancer des exceptions. J'ai essayé de regarder la différence avant et après le script. Et j'ai remarqué que le bit (1) était devenu tinyint (1).
J'ai ensuite couru:
Ce qui a résolu le problème.
la source