Confusion BOOLEAN ou TINYINT

91

Je concevais une base de données pour un site où je dois utiliser un type de données booléen pour stocker seulement 2 états, vrai ou faux. J'utilise MySQL.
Lors de la conception de la base de données à l'aide de phpMyAdmin, j'ai constaté que j'avais à la fois le type de données BOOLEAN et le type de données TINYINT.
J'ai parcouru différents articles, certains ont dit que TINYINT est le même que BOOLEAN, aucune différence. Certains disent que BOOLEAN est converti en TINYINT dans MySQL.

Ma question est: s'ils sont tous les deux identiques, pourquoi y en a-t-il deux? Il ne devrait y en avoir qu'un seul.

Voici la référence aux articles que j'ai lus:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Bipin Chandra Tripathi
la source

Réponses:

137

MySQL n'a pas de type de données booléen interne. Il utilise le plus petit type de données entier - TINYINT.

BOOLEAN et BOOL sont des équivalents de TINYINT (1), car ce sont des synonymes.

Essayez de créer ce tableau -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Exécutez ensuite SHOW CREATE TABLE, vous obtiendrez cette sortie -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
Devart
la source
1
Mais votre réponse est correcte dans tous les autres aspects. Ce qui semble dérouter le PO, c'est l'existence de synonymes.
ypercubeᵀᴹ
2
Il semble que cela soit fait pour la compatibilité descendante. Le type de données BOOLEAN était antérieur à MySQL 5 et le type BIT n'était pas optimisé, c'était aussi TINYINT. De la documentation - Nouvelles fonctionnalités prévues pour 5.1: Optimiser le type de BIT pour prendre un bit. (BIT prend maintenant un octet; il est traité comme un synonyme de TINYINT.).
Devart
5
Oui, vous pouvez savoir avoir BIT(1)ou BIT(17)ou mêmeBIT(64)
ypercubeᵀᴹ
3
@Devart - Là où votre réponse a le plus de votes et apparaît en premier (dans ma liste de toute façon) et qu'un certain temps s'est écoulé, y a-t-il une chance que vous soyez prêt à ajouter à votre réponse pour inclure une discussion sur le type de BIT sur MySQL 5.1 et plus tard?
Jonathan
3
@Jonathan Le mentionner est peut-être intéressant, mais BIT (1) n'utilise pas moins d'espace que TINYINT (1) et ne s'affiche pas comme la plupart des gens s'y attendraient en utilisant la console mysql standard. En raison de cet inconvénient, et aucun avantage de stockage, la simple utilisation de TINYINT (1) ou de BOOLEAN semble être la plus courante de mon expérience.
Tyler Smith
31

Juste une note pour les développeurs php (il me manque les points stackoverflow nécessaires pour poster ceci en commentaire) ... la conversion automatique (et silencieuse) en TINYINT signifie que php récupère une valeur d'une colonne "BOOLEAN" comme un "0" ou "1", pas l'attendu (par moi) vrai / faux.

Un développeur qui regarde le SQL utilisé pour créer une table et voit quelque chose comme: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE" pourrait raisonnablement s'attendre à voir des résultats vrai / faux lorsqu'une ligne contenant cette colonne est récupérée. A la place (du moins dans ma version de PHP), le résultat sera "0" ou "1" (oui, une chaîne "0" ou une chaîne "1", pas un int 0/1, merci php).

C'est un peu, mais suffisant pour faire échouer les tests unitaires.

Tom Stambaugh
la source
2
Comme note supplémentaire, les pilotes mysql de PHP récupèrent tous les types entiers sous forme de chaînes.
kojow7
24

Les dernières versions de MySQL ont le nouveau BITtype de données dans lequel vous pouvez spécifier le nombre de bits dans le champ, par exemple BIT(1)à utiliser comme Booleantype, car il ne peut s'agir que de 0ou 1.

Please_Dont_Bully_Me_SO_Lords
la source
7

À partir de la référence de version MySql 5.1

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

=================================================== ========================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

fortune
la source
1
Votre référence indique que le stockage requis est en fait "environ (M + 7) / 8 octets". c'est-à-dire qu'il arrondit au prochain octet complet. Ainsi, cela ne prend pas 1 bit.
mpen