MySql: Tinyint (2) vs tinyint (1) - Quelle est la différence?

183

Je connaissais le booléen dans mysql comme tinyint (1).

Aujourd'hui, je vois une table avec défini un entier comme tinyint(2), et aussi d'autres comme int(4), int(6)...

Que signifie la taille dans un champ de type integer et tinyint?

realtebo
la source
4
En savoir plus sur les types de données MySQL Integer ici .
Bud Damyanov
2
La réponse de @ AamirR est la bonne
evilReiko
1
@evilReiko zerofill ne fait pas non plus de différence dans la façon dont la valeur est stockée, il s'agit vraiment de présentation ... les espaces ou les zéros ne font pas vraiment de différence dans l'exactitude de la réponse de quiconque imo
Ja͢ck

Réponses:

94

Cela signifie largeur d'affichage

Que vous utilisiez tinyint (1) ou tinyint (2), cela ne fait aucune différence.

J'utilise toujours tinyint (1) et int (11), j'ai utilisé plusieurs clients mysql (navicat, sequel pro).

Cela ne veut rien dire du tout! J'ai exécuté un test, tous les clients ci-dessus ou même le client de ligne de commande semble ignorer cela.

Mais, la largeur d'affichage est plus importante si vous utilisez l' ZEROFILLoption, par exemple votre tableau a les 2 colonnes suivantes:

Un zerofill minuscule (2)

B tinyint (4) zerofill

les deux colonnes ont la valeur 1, la sortie pour la colonne A serait 01et 0001pour B , comme le montre la capture d'écran ci-dessous :)

zerofill avec displaywidth

AamirR
la source
20
Curieusement, je viens de découvrir que dans le connecteur MySQL officiel C #, tinyint (1) ne renvoie jamais des valeurs différentes de 0 et 1. Cela a probablement à voir avec tinyint (1) étant automatiquement reconnu comme un booléen. Juste un avertissement, cela compte parfois.
Daniel Sharp
N'est-il pas préférable d'utiliser un type entier et une longueur aussi petits que possible? J'avais l'impression que cette mémoire sauvegardée dans MySQL.
nclsvh
Comme le souligne @ Daniel-Sharp, cela peut sembler important pour les connecteurs. J'ai juste eu un problème avec Hibernate en utilisant JDBC signalant qu'il a interprété un TINYINT (1) comme un BIT.
sfj
2
@DanielSharp qui est probablement dû à l'option de connexion tinyInt1isBit qui par défaut est true. Voir dev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56
1
J'ai toujours pensé que cela avait quelque chose à voir avec le nombre de nombres acceptés (par exemple, int (4) ne permettant rien au-dessus de 9999). Je suppose que j'ai toujours pensé mal alors. En ligne de commande PHP et MySQL, je vois bien la valeur au-dessus.
Joshua Bakker
226

Le (m)indique la largeur d'affichage de la colonne; des applications telles que le client MySQL en font usage lors de l'affichage des résultats de la requête.

Par exemple:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

Ici a, bet cutilisent TINYINT(1), TINYINT(2)et TINYINT(3)respectivement. Comme vous pouvez le voir, il remplit les valeurs sur le côté gauche en utilisant la largeur d'affichage.

Il est important de noter que cela n'affecte pas la plage de valeurs acceptée pour ce type particulier, c'est-à-dire TINYINT(1)qu'il accepte toujours [-128 .. 127].

Jack
la source
16
qu'est-ce que cela signifie «largeur de colonne» ??
realtebo
8
@realtebo est principalement utilisé par le client de ligne de commande mysql à des fins d'affichage.
Ja͢ck
3
Le nombre de "chiffres" affiché par l'interface. En d'autres termes, il ajoutera des zéros à gauche. Ce type de fonctionnalité avait du sens au tout début des bases de données, mais il ne s'agit plus que d'un héritage.
Denilson Sá Maia
2
@Kailas Si vous n'utilisez pas le client mysql? Pas du tout.
Ja͢ck
11
@Kailas Non! tinyint (1) n'accepte que 0-9. Il accepte toute la gamme de ce que tinyint peut contenir.
Ja͢ck
18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)
zloctb
la source
11
Veuillez modifier votre réponse pour inclure des explications. Les réponses basées uniquement sur le code font très peu pour éduquer les futurs lecteurs SO. Votre réponse est dans la file d'attente de modération pour être de mauvaise qualité.
mickmackusa
14

À propos de INT, TINYINT ... Ce sont différents types de données, INT est un nombre à 4 octets, TINYINT est un nombre à 1 octet. Plus d'informations ici - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

La syntaxe du type de données TINYINT est TINYINT (M), où M indique la largeur d'affichage maximale (utilisée uniquement si votre client MySQL la prend en charge).

Attributs de type numérique .

Devart
la source
1
qu'est-ce que cela signifie «largeur d'affichage»!?
realtebo
2
À partir de la référence - Par exemple, INT (4) spécifie un INT avec une largeur d'affichage de quatre chiffres. Cette largeur d'affichage facultative peut être utilisée par les applications pour afficher des valeurs entières ayant une largeur inférieure à la largeur spécifiée pour la colonne en les remplissant à gauche avec des espaces.
Devart
2
Mais je n'ai pas vu d'applications ou de clients MySQL qui utilisent cette fonctionnalité. J'utilise toujours INT (11) et j'utilise des fonctions de formatage pour personnaliser la sortie.
Devart