106 votes

Confusion BOOLEAN ou TINYINT

J'ai conçu une base de données pour un site où j'ai besoin d'utiliser un type de données booléen pour stocker seulement 2 états, vrai ou faux. J'utilise MySQL.
En concevant 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 disent que TINYINT est identique à BOOLEAN, aucune différence. Certains disent que BOOLEAN est converti en TINYINT dans MySQL.

Ma question est la suivante : si les deux sont identiques, pourquoi en existe-t-il deux ? Il ne devrait y en avoir qu'un seul.

Voici la référence des 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

148voto

Devart Points 52715

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

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

Essayez de créer cette table -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Ensuite, exécutez SHOW CREATE TABLE, vous obtiendrez cette sortie -

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

34voto

Tom Stambaugh Points 37

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

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 quand une ligne contenant cette colonne est récupérée. 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 int 0/1, merci php).

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

24voto

EASI Points 1827

Les versions les plus récentes de MySQL ont le nouveau BIT type de données dans lequel vous pouvez spécifier le nombre de bits dans le champ, par exemple BIT(1) à utiliser comme Boolean car il ne peut être que 0 o 1 .

7voto

fortune Points 1610

À partir de la version MySql 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

6voto

La vue d'ensemble des types numériques pour les états MySQL : 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X