Lorsque nous utilisons une longueur d'argument avec des types de données numériques, autant que je sache, cela spécifie la largeur d'affichage.
J'ai essayé ce qui suit:
mysql> create table boolean_test (var1 boolean, var2 tinyint);
Query OK, 0 rows affected (0.10 sec)
mysql> show create table boolean_test;
+--------------+-------------------------
| Table | Create Table
+--------------+-------------------------
| boolean_test | CREATE TABLE `boolean_test` (
`var1` tinyint(1) DEFAULT NULL,
`var2` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------------+---------------------------
1 row in set (0.00 sec)
Tout d'abord, tinyint est une valeur de 1 octet. Alors, quelle est la signification de tinyint(4)
? Il ne peut pas y avoir 4 chiffres.
mysql> insert into boolean_test values(101,112);
Query OK, 1 row affected (0.03 sec)
mysql> select * from boolean_test;
+------+------+
| var1 | var2 |
+------+------+
| 10 | 112 |
| 101 | 112 |
+------+------+
2 rows in set (0.00 sec)
Je vois que dans tinyint j'ai stocké un 10 et 101 et je pourrais récupérer ces valeurs malgré le fait qu'il soit défini comme tinyint (1).
Ne devrais-je pas voir un 1 pour var1
? C'est à dire. seulement 1 chiffre d'affichage?
Côté données, tinyint(1)
, tinyint(2)
, tinyint(3)
etc. sont tous identiques. Ils sont tous compris entre -128 et 127 pour SIGNED
ou 0-255 pour UNSIGNED
. Comme d'autres réponses l'ont noté, le nombre entre parenthèses n'est qu'un indice de largeur d'affichage.
Vous voudrez peut-être noter, cependant, que les choses application = sage peuvent sembler différentes. Ici, tinyint(1)
peut prendre une signification particulière. Par exemple, le connecteur/J (connecteur Java) traite tinyint(1)
comme une valeur booléenne et au lieu de renvoyer un résultat numérique à l'application, il convertit les valeurs en true
et false
. cela peut être modifié via le tinyInt1isBit=false
paramètre de connexion.
Un tinyint (1) peut contenir des nombres compris entre -128 et 127, car le type de données est de 8 bits (1 octet) - de toute évidence, un tinyint non signé peut contenir des valeurs de 0 à 255.
Il tronquera silencieusement les valeurs hors limites:
mysql> create table a
-> (
-> ttt tinyint(1)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from a;
+------+
| ttt |
+------+
| 127 |
| -128 |
| 127 |
| -128 |
+------+
4 rows in set (0.00 sec)
mysql>
... sauf si vous modifiez le sql_mode
ou modifiez la configuration du serveur:
mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>
La valeur utilisée dans la DDL pour le type de données (par exemple: tinyint (1)) est, comme vous le soupçonniez, la largeur d'affichage. Cependant, il est facultatif et les clients n'ont pas à l'utiliser. Le client MySQL standard ne l'utilise pas, par exemple.