2010-09-20 7 views
80

Quel type de colonne convient le mieux d'utiliser dans une base de données MySQL pour les valeurs booléennes? J'utilise boolean mais mon collègue utilise tinyint(1).Boolean vs tinyint (1) pour les valeurs booléennes dans MySQL

+0

Il semble que MySQL traite de façon transparente 'boolean' comme' tinyint (1) '. Vous pouvez donc utiliser 'boolean',' true' et 'false' et MySQL les traite comme' tinyint (1) ',' 1' et '0'. – ADTC

+0

Un autre cas est char 1 avec Y & N qui est censé être plus rapide par certaines personnes. – Zon

Répondre

99

Ces types de données sont synonymes.

+15

Yep - http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html –

+0

Je ne dirais pas que les données _types_ sont synonymes - tinyint (1) est le même que bool , mais tinyint et bool ne sont pas les mêmes.Point mineur, mais votre réponse m'a fait trébucher la première fois que je l'ai lu –

+0

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 y avait de mieux à 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. –

27

boolean n'est pas un type de données distinct dans MySQL; c'est juste un synonyme pour tinyint. See this page in the MySQL manual.

Personnellement, je suggère d'utiliser tinyint en tant que préférence, parce que booléen ne fait pas ce que vous pensez qu'il fait du nom, donc il fait un code potentiellement trompeur. Mais à un niveau pratique, cela n'a pas vraiment d'importance - ils font tous les deux la même chose, donc vous ne gagnez pas ou ne perdez rien en utilisant non plus.

6

utilisation ENUM son facile et le plus rapide de la

je ne recommande pas ENUM ou tinyint (1) bit (1) n'a besoin que d'1 bit pour stocker la valeur booléenne en tinyint (1) a besoin de 8 bits.

ref

TINYINT vs ENUM(0, 1) for boolean values in MySQL

+0

Nous ne pouvons pas utiliser enum car notre base de données doit également prendre en charge sqlite – tom

+6

Si vous utilisez InnoDB, bit finit avec autant d'espace que tinyint. De [High Performance MySQL] (http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/1449314287/) (les gars de percona) "InnoDB stocke [s] chaque colonne [bit] comme le plus petit type entier assez grand pour contenir les bits, donc vous ne sauvegardez pas d'espace de stockage. " Le seul gain est si vous stockez plusieurs valeurs booléennes dans une colonne BIT (morethan1). Donc, si vous n'avez qu'un seul champ booléen, l'utilisation de tinyint est la même chose que dans InnoDB, et c'est préférable car tinyint est généralement plus facile à utiliser. – billmalarky

60

Je vais prendre une approche différente ici et suggèrent qu'il est tout aussi important pour vos collègues développeurs de comprendre votre code comme 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 la peine.

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.

0

Mon expérience lors de l'utilisation Dapper pour se connecter à MySQL est que cela importe. J'ai changé un peu non annulable (1) à un annulable tinyint (1) en utilisant le script suivant:

ALTER TABLE TableName MODIFY Setting BOOLEAN null; 

Alors Dapper commencé à jeter des exceptions. J'ai essayé de regarder la différence avant et après le script. Et remarqué que le bit (1) avait changé en tinyint (1).

Je puis a couru:

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

qui a résolu le problème.

1

Il est vrai que bool et tinyint(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. En outre, de nombreux ORM convertissent bool en type booléen natif de votre langage de programmation.

Questions connexes