Quelle est la taille de la colonne de int (11) dans mysql en octets?


488

Quelle est la taille de la colonne de int(11)dans mysql en octets?

Et la valeur maximale qui peut être stockée dans ces colonnes?



1
@cellepo l'un est sql générique l'autre est spécifique à mysql (plus celui-ci a beaucoup plus de vues). Si vous voulez partir à la chasse aux dupes et que je les ferme rapidement en un seul vote, visitez le chat SOBotics et envoyez -moi un ping. Mais celui à fermer doit être étiqueté mysqlavant mon arrivée. Thx
Drew

6
Salut les gars. Il est peut-être en double, mais il est plus convivial pour la recherche. La plupart des gens recherchent comme ceci en utilisant int (11). et cela résout les questions des autres. vous pouvez vérifier son nombre de vue comparatif à l'autre. et l'utilisateur trouvera une réponse plus détaillée ici.
Gaurav

Réponses:


685

Un INTsera toujours de 4 octets, quelle que soit la longueur spécifiée.

  • TINYINT = 1 octet (8 bits)
  • SMALLINT = 2 octets (16 bits)
  • MEDIUMINT = 3 octets (24 bits)
  • INT = 4 octets (32 bits)
  • BIGINT = 8 octets (64 bits).

La longueur spécifie simplement le nombre de caractères à remplir lors de la sélection de données avec le client de ligne de commande mysql. 12345 stocké comme int(3)affichera toujours 12345, mais s'il était stocké comme int(10)il afficherait toujours comme 12345, mais vous auriez la possibilité de remplir les cinq premiers chiffres. Par exemple, si vous l' ZEROFILLajoutez, il s'affichera comme 0000012345.

... et la valeur maximale sera 2147483647 (signé) ou 4294967295 (non signé)


111
alors quel est le sens de 11 dans int (11) ici.
Gaurav

73
Colonne INT (4), l'entier 1 serait affiché comme 0001 UNIQUEMENT si la colonne était également spécifiée comme zerofill. Sinon, il sera simplement affiché sous le numéro 1, sans chiffres supplémentaires. @Gaurav - ne mélangez pas comment mysql affiche les données et comment elles les stockent, ce sont deux choses différentes. Ce que vous voyez n'est pas vraiment ce qu'il pourrait être.
Michael JV

13
@Michael Wow, vraiment intéressant. Donc, si vous créez une colonne INT (3) et stockez une valeur 5001, elle stockera 5001 mais n'affichera que 1. Je ne le savais pas.
andrewtweber

16
@andrewtweber: 5001s'affiche comme 5001même si le champ est défini comme INT(3). Voir la réponse @priyabagus ci-dessous et ici .
go2null

10
Si vous ne fournissez pas de longueur pour les champs entiers, MySQL définira une valeur par défaut (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20). Il convient de noter que ces longueurs par défaut sont suffisantes pour afficher tout nombre qui peut être stocké dans ce champ (ex: smallint max value is 2 ^ 16 = 65536, 5 digits) Sauf si vous avez une très bonne raison de faire autrement, je vous recommande de laisser les tailles par défaut pour éviter les mauvaises surprises.
Thibault Witzig

167

INT ( x ) ne fera la différence qu'en termes d'affichage , c'est-à-dire afficher le nombre en x chiffres, et non limité à 11. Vous le jumelez en utilisantZEROFILL , qui ajoutera les zéros jusqu'à ce qu'il corresponde à votre longueur.

Donc, pour un nombre quelconque de x dansINT(x)

  • si la valeur stockée a moins de chiffres que x , ZEROFILLajoutera des zéros.

    INT (5) ZEROFILL avec la valeur stockée de 32 affichera 00032
    INT (5) avec la valeur stockée de 32 affichera 32
    INT avec la valeur stockée de 32 affichera 32

  • si la valeur stockée a plus de chiffres que x , elle sera affichée telle quelle.

    INT (3) ZEROFILL avec la valeur stockée de 250000 affichera 250000
    INT (3) avec la valeur stockée de 250000 affichera 250000
    INT avec la valeur stockée de 250000 affichera 250000

La valeur réelle stockée dans la base de données n'est pas affectée, la taille est toujours la même et tout calcul se comportera normalement.

Cela s'applique également à BIGINT, MEDIUMINT, SMALLINT et TINYINT.


49
Donc, la longueur ne fait absolument rien sauf si vous utilisez du zerofill?
developerbmw

29
@developerbmw - Correct. La longueur ne fait absolument rien sauf si vous l'utilisez ZEROFILL.
Rick James

ZEROFILL est essentiellement un mode de compatibilité mainframe.
Henk Poley

114

Selon ici , int(11)prendra 4 octets d'espace soit 32 bits d'espace avec une 2^(31) = 2147483648valeur maximale et une -2147483648valeur minimale. Un bit est pour le signe.


1
Votre exemple a 9 neuf. Pouvez-vous s'il vous plaît confirmer que votre exemple est correct? Si oui, pourquoi dit-il 10 alors qu'il y a 9 neuf? Est-ce le nombre de chiffres plus un plus le signe?
Homer6

5
Non, le nombre maximum est 4294967295 s'il n'est pas signé int, c'est-à-dire 2 ^ 32. Le nombre entre parenthèses n'affecte pas le type de stockage. Si vous avez besoin de plus de 2 ^ 32, vous devez aller à bigint.
Kieran Tully

7
Ou plutôt, (2 ^ 32) -1.
Kieran Tully

2
+ Kieran a raison. Le nombre maximum est différent de celui de la réponse. Voir ici
daviewales

38

Comme d'autres l'ont dit, les valeurs minimum / maximum que la colonne peut stocker et la quantité de stockage qu'elle prend en octets n'est définie que par le type, pas la longueur.

Beaucoup de ces réponses disent que la (11)partie n'affecte que la largeur d'affichage, ce qui n'est pas exactement vrai, mais surtout.

Une définition int(2)avec aucune ZEROFILL spécifiée sera:

  • accepter toujours une valeur de 100
  • affiche toujours une valeur de 100sortie (pas 0ou 00)
  • la largeur d'affichage sera la largeur de la plus grande valeur sortie de la requête de sélection.

La seule chose à (2)faire est que le zerofill soit également spécifié :

  • une valeur de 1sera affichée 01.
  • Lors de l'affichage des valeurs, la colonne aura toujours un largeur de la valeur maximale possible que la colonne pourrait prendre qui est de 10 chiffres pour un entier, au lieu de la largeur minimale requise pour afficher la plus grande valeur que la colonne doit afficher pour cette requête de sélection spécifique , qui pourrait être beaucoup plus petit.
  • La colonne peut toujours prendre et afficher une valeur dépassant la longueur, mais ces valeurs ne seront pas préfixées de 0.

La meilleure façon de voir toutes les nuances est d'exécuter:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

qui produira:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

Cette réponse est testée par rapport à MySQL 5.7.12 pour Linux et peut ou non varier pour d'autres implémentations.


5
"Remarquez comment la colonne int1 a une largeur d'affichage beaucoup plus petite que zerofill2 même si la longueur est plus grande" ... Ehm, c'est juste parce que le nom de la colonne 'zerofill2' est long de 9 caractères contre 'int1' étant 4.
neokio

2
... oui, la longueur n'a donc clairement aucun effet, même sur la largeur de l'écran lorsque le zerofill n'est pas activé. Sinon, int1 serait beaucoup plus large avec une largeur de 10 caractères à la place.
Programster du

2
Une bonne explication avec un exemple solide. Meilleure réponse que celle acceptée. Merci @Programster.
Corin

Nit mineur: Comme le souligne neokio, ne peut pas observer à partir de cette requête les conséquences exactes de "int (3)" avec un remplissage nul. Raccourcissez le nom de la colonne à "zf2", pour rendre le comportement plus clair. Plus précisément, que ce soit vrai ou faux [sur une version de base de données donnée] qui "(avec zerofill) Lors de l'affichage des valeurs, la colonne aura toujours une largeur de la valeur maximale possible que la colonne pourrait prendre, qui est de 10 chiffres pour un entier,"
ToolmakerSteve

1
Pour clarifier le commentaire de neokio et mon commentaire mineur: La phrase "Remarquez comment la colonne int1 a une largeur d'affichage beaucoup plus petite que zerofill2 même si la longueur est plus grande." devrait être supprimé de la réponse. C'est une conséquence du nombre de caractères dans le mot d'en-tête "zerofill2" - cela n'a rien à voir avec le test des largeurs d'affichage. Mieux vaut donner à cette colonne un nom plus court, par exemple "zf2". Nous aurions alors un tableau où "int1, int2 et zf2 ont tous exactement la même largeur, même si int2 et zf2 spécifient une petite largeur (3)".
ToolmakerSteve

32

Quelle est la taille de la colonne de int (11) dans mysql en octets?

(11)- cet attribut de inttype de données n'a rien à voir avec la taille de la colonne. Il s'agit simplement de la largeur d'affichage du type de données entier. À partir du 11.1.4.5. Attributs de type numérique :

MySQL prend en charge une extension pour spécifier éventuellement la largeur d'affichage des types de données entiers entre parenthèses après le mot-clé de base pour le type. Par exemple, INT (4) spécifie un INT avec une largeur d'affichage de quatre chiffres.


19

Une bonne explication à cela peut être trouvée ici

Pour résumer: Le nombre N dans int (N) est souvent confondu par la taille maximale autorisée pour la colonne, comme il le fait dans le cas de varchar (N).

Mais ce n'est pas le cas avec les types de données Integer - le nombre N entre parenthèses n'est pas la taille maximale de la colonne, mais simplement un paramètre pour indiquer à MySQL à quelle largeur afficher la colonne lorsque les données de la table sont visualisées via MySQL console (lorsque vous utilisez l'attribut ZEROFILL).

Le nombre entre parenthèses indiquera à MySQL combien de zéros remplir les entiers entrants. Par exemple: si vous utilisez ZEROFILL sur une colonne définie sur INT (5) et que le nombre 78 est inséré, MySQL remplira cette valeur avec des zéros jusqu'à ce que le nombre satisfasse le nombre entre parenthèses. ie 78 deviendra 00078 et 127 deviendra 00127. Pour résumer: Le nombre entre parenthèses est utilisé à des fins d'affichage.
D'une certaine manière, le nombre entre parenthèses est un peu inutile, sauf si vous utilisez l'attribut ZEROFILL.

Ainsi, la taille de l'int reste la même, c'est-à-dire -2147483648 à 2147483648 pour signé et 0 à 4294967295 pour non signé.(~ 2,15 milliards et 4,2 milliards, ce qui est l'une des raisons pour lesquelles les développeurs ignorent l'histoire derrière le numéro N entre parenthèses, car il n'affecte guère la base de données à moins qu'elle ne contienne plus de 2 milliards de lignes), et en termes d'octets serait de 4 octets .

Pour plus d'informations sur la taille / plage des types entiers, reportez-vous au manuel MySQL


Pourquoi le nombre de lignes entre-t-il en jeu ici?
Old Geezer

@OldGeezer - d'accord, le "nombre de lignes" n'est pas pertinent pour la plupart des colonnes. Uniquement pertinent pour la colonne de clé primaire (id) à incrémentation automatique.
ToolmakerSteve

10

Bien que cette réponse soit peu susceptible d'être vue, je pense que la clarification suivante mérite d'être apportée:

  • le (n) derrière un type de données entier dans MySQL spécifie la largeur d'affichage
  • la largeur d'affichage ne limite PAS la longueur du nombre renvoyé par une requête
  • la largeur d'affichage LIMITE le nombre de zéros remplis pour une colonne remplie de zéro afin que le nombre total corresponde à la largeur d'affichage (tant que le nombre réel ne dépasse pas la largeur d'affichage, auquel cas le nombre est affiché tel quel)
  • la largeur d'affichage est également conçue comme un outil utile pour les développeurs de savoir à quelle longueur la valeur doit être complétée

UN PEU DE DÉTAIL
la largeur d'affichage est apparemment destinée à fournir des métadonnées sur le nombre de zéros à afficher dans un nombre rempli de zéro.
Il ne limite PAS réellement la longueur d'un nombre renvoyé par une requête si ce nombre dépasse la largeur d'affichage spécifiée.
Pour savoir quelle longueur / largeur est réellement autorisée pour un type de données entier dans MySQL, consultez la liste et le lien: ( types: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
Cela dit, vous pouvez vous attendre à ce que la largeur d'affichage n'affecte pas les résultats d'une requête standard, sauf si les colonnes sont spécifiées en tant que colonnes ZEROFILL
OU
dans le cas où les données sont extraites dans une application et que cette application collecte les largeur d'affichage à utiliser pour un autre type de rembourrage.

Référence principale: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean


Merci d'avoir fourni la bonne réponse. J'essayais depuis la ligne de commande MySQL, et je ne pouvais pas l'obtenir pour couper les chiffres avec des petits n, alors ... ouais, c'est du bullcrap. Il ne fait rien avec du zerofill.
mpen

@mpen heureux d'avoir pu aider, c'était lié à quelque chose que j'essayais et j'ai pensé que je pourrais mettre plus de détails à ce sujet ici qui pourraient être utiles à quelqu'un d'autre.
MER

9

Dans MySQL, l'entier int(11)a une taille de 4 octets, ce qui correspond à 32 bits.

La valeur signée est: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

Les valeurs non signées sont: 0 to 2^32-1 = 0 to 4294967295


0

selon ce livre :

MySQL vous permet de spécifier une «largeur» pour les types entiers, tels que INT (11). Cela n'a aucun sens pour la plupart des applications: il ne restreint pas la plage de valeurs légale, mais spécifie simplement le nombre de caractères que les outils interactifs de MySQL réservent à des fins d'affichage. À des fins de stockage et de calcul, INT (1) est identique à INT (20).


-4

Je pense que la valeur maximale de int (11) est 4294967295


2
C'est 2147483647 car il a un signe.
d3bit

-9

4294967295 est la réponse, car int (11) affiche un maximum de 11 chiffres IMO

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.