web-dev-qa-db-fra.com

Confusion BOOLÉEN ou TINYINT

Je concevais une base de données pour un site sur lequel je devais utiliser un type de données booléen pour ne stocker que 2 états, true ou false. J'utilise MySQL.
Lors de la conception de la base de données à l’aide de phpMyAdmin, j’ai constaté que j’ai le type de données BOOLEAN et le type de données TINYINT.
J'ai lu différents articles, certains ont dit que TINYINT était identique à BOOLEAN, aucune différence. Certains disent que BOOLEAN est converti en TINYINT dans MySQL.

Ma question est, si les deux sont identiques, pourquoi existe-t-il deux? Il devrait y avoir qu'un seul d'entre eux.

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/fr/numeric-type-overview.html

78

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 ils sont synonymes.

Essayez de créer cette table - 

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Puis lancez SHOW CREATE TABLE, vous obtiendrez cette sortie -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
114
Devart

Juste une note pour les développeurs php (il me manque les points de stackoverflow nécessaires pour poster ceci en tant que commentaire) ... la conversion automagique (et silencieuse) en TINYINT signifie que php récupère une valeur d'une colonne "BOOLEAN" sous la forme d'un "0" "1", pas le prévu (par moi) vrai/faux.

Un développeur qui examine le SQL utilisé pour créer une table et voit quelque chose comme: "Some_boolean BOOLEAN NOT NULL DEFAULT FALSE", peut raisonnablement s'attendre à voir des résultats true/false lorsqu'une ligne contenant cette colonne est extraite. Au lieu de cela (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 entier 0/1, merci php).

C'est un nit, mais suffisant pour que les tests unitaires échouent.

28
Tom Stambaugh

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

A partir de MySql version 5.1 référence

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

7
fortune

La présentation des types numériques pour MySQL indique: BOOL, BOOLEAN: Ces types sont des synonymes de TINYINT (1). Une valeur de zéro est considérée comme fausse. Les valeurs non nulles sont considérées comme vraies.

Voir ici: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

0