Quelle est la signification de tinyint (N)?

17

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 quel est le sens 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? Ie seulement 1 chiffres d'affichage?

Cratylus
la source
Pourquoi avez-vous deux rangées après un insert? Je ne peux pas comprendre complètement ce code.
WoodrowShigeru

Réponses:

24

-Sage données, tinyint(1), tinyint(2), tinyint(3)etc sont tous exactement la même chose. Ils sont tous dans la gamme -128 à 127 pour SIGNEDou 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 être différentes. Ici, tinyint(1)peut prendre une signification particulière. Par exemple, le connecteur / J (connecteur Java) est traité tinyint(1)comme une valeur booléenne et au lieu de renvoyer un résultat numérique à l'application, il convertit les valeurs en trueet false. cela peut être modifié via le tinyInt1isBit=falseparamètre de connexion.

Shlomi Noach
la source
13

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 sql_modeou 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.

Philᵀᴹ
la source