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).

à M
la source
3
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.
Zon

Réponses:

153

Ces types de données sont des synonymes.

Māris Kiseļovs
la source
6
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.

dj_segfault
la source
35

booleann'est pas un type de données distinct dans MySQL; c'est juste un synonyme de tinyint. 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.

Spudley
la source
8

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

Pramendra Gupta
la source
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.
billmalarky
Pas vrai pour MySQL: BIT(M) - approximately (M+7)/8 bytesvoir: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

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.

Kyle Morgan
la source
0

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:

ALTER TABLE 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).

J'ai ensuite couru:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Ce qui a résolu le problème.

smerlung
la source