phpMyAdmin
 sql >> Base de données >  >> Database Tools >> phpMyAdmin

Pourquoi TINYINT(1) fonctionne-t-il comme un booléen mais pas INT(1) ?

Le (1) entre parenthèses pour un type entier MySQL n'a rien à voir avec la plage de valeurs acceptées par le type de données, ou la façon dont il est stocké. C'est seulement pour l'affichage.

Voir aussi ma réponse à Types in MySQL :BigInt(20) contre Int(20) etc .

TINYINT n'est pas différent de TINYINT(1) ou TINYINT(2) ou TINYINT(64). C'est un type de données entier signé 8 bits, et il accepte n'importe quelle valeur entière 8 bits de -128 à 127.

mysql> create table b (i tinyint(1));

mysql> insert into b values (42);

mysql> select * from b;
+------+
| i    |
+------+
|   42 |
+------+

Pour plus de commodité, MySQL prend en charge un alias pour BOOL, qui est immédiatement remplacé par TINYINT(1).

mysql> create table b2 (i bool);

mysql> show create table b2;

CREATE TABLE `b2` (
  `i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Comme je l'ai dit, l'utilisation de (1) ne signifie presque rien, c'est seulement une convention de sorte que si vous voyez TINYINT(1), il est raisonnable de supposer que la colonne est prévue à utiliser comme booléen. Mais rien dans MySQL ne vous empêche d'y stocker d'autres valeurs entières.

Si vous voulez qu'une colonne accepte uniquement 0 ou 1, vous pouvez utiliser BIT(1):

mysql> create table b3 (i bit(1));

mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1

mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1

Cependant, cela n'économise pas d'espace par rapport à TINYINT, car le stockage d'une colonne donnée est arrondi à l'octet le plus proche.

PS :malgré la réponse de @samdy1, TINYINT ne stocke pas les chaînes '0' ou '1' du tout, il stocke des entiers 0 ou 1 , ainsi que d'autres entiers de -128 à 127. Il n'est pas nécessaire de mettre des entiers entre guillemets en SQL, et je suis souvent perplexe quant à la raison pour laquelle tant de développeurs le font.