416 votes

Quelle est la différence entre tinyint, smallint, mediumint, bigint et int dans MySQL ?

Quelle est la différence entre tinyint, smallint, mediumint, bigint et int dans MySQL ?

Dans quels cas faut-il les utiliser ?

641voto

Daniel DiPaolo Points 24085

Ils n'occupent pas tous la même place et leurs valeurs acceptables varient.

Voici les tailles et les plages de valeurs pour SQL Server D'autres SGBDR ont une documentation similaire :

Il s'avère qu'ils utilisent tous la même spécification (avec quelques exceptions mineures notées ci-dessous) mais supportent diverses combinaisons de ces types (Oracle n'est pas inclus parce qu'il n'a qu'une NUMBER voir le lien ci-dessus) :

             | SQL Server    MySQL   Postgres    DB2
---------------------------------------------------
tinyint      |     X           X                
smallint     |     X           X         X        X
mediumint    |                 X
int/integer  |     X           X         X        X 
bigint       |     X           X         X        X

Ils prennent en charge les mêmes plages de valeurs (à une exception près, ci-dessous) et ont tous les mêmes exigences en matière de stockage :

            | Bytes    Range (signed)                               Range (unsigned)
--------------------------------------------------------------------------------------------
tinyint     | 1 byte   -128 to 127                                  0 to 255
smallint    | 2 bytes  -32768 to 32767                              0 to 65535
mediumint   | 3 bytes  -8388608 to 8388607                          0 to 16777215
int/integer | 4 bytes  -2147483648 to 2147483647                    0 to 4294967295
bigint      | 8 bytes  -9223372036854775808 to 9223372036854775807  0 to 18446744073709551615 

Les types "non signés" ne sont disponibles que dans MySQL, et les autres utilisent simplement les plages signées, à une exception près : tinyint dans SQL Server est non signée et a une plage de valeurs de 0 à 255

26 votes

Je ne savais pas que les types non signés étaient disponibles uniquement dans MySQL, c'est un énorme avantage de MySQL par rapport aux autres SGBDR. Quelque chose a changé depuis la publication de cette réponse ?

4 votes

@Daniel, A quoi pensent-ils, pourquoi y en a-t-il un pour 3 octets mais aucun pour 6 octets ?

11 votes

@Pacerier probablement qu'ils ne savaient pas comment le nommer :))

42voto

SQLMenace Points 68670

El taille du stockage nécessaire et quelle taille les chiffres peuvent l'être.

Sur SQL Server :

  • tinyint 1 octet, de 0 à 255
  • smallint 2 octets, -2 15 (-32,768) à 2 15-1 (32,767)
  • int 4 octets, -2 31 (-2.147.483.648) à 2 31-1 (2,147,483,647)
  • bigint 8 octets, -2 63 (-9,223,372,036,854,775,808) à 2 63-1 (9,223,372,036,854,775,807)

Vous pouvez stocker le nombre 1 dans les 4, mais un bigint utilisera 8 octets, tandis qu'une tinyint utilisera 1 octet.

21voto

ANeves Points 2711

Il semble s'agir de types de données MySQL.

Selon le documentation qu'ils prennent :

  1. tinyint = 1 octet
  2. smallint = 2 octets
  3. mediumint = 3 octets
  4. int = 4 octets
  5. bigint = 8 octets

Et, naturellement, accepter des plages de chiffres de plus en plus larges.

12voto

Anil M Points 139

Lorsqu'il s'agit d'utiliser ces types de données dans le monde réel, il est très important que vous compreniez que l'utilisation de certains types d'entiers peut être exagérée ou sous-utilisée. Par exemple, l'utilisation du type de données integer pour le nombre d'employés dans une table intitulée employee pourrait être exagérée puisqu'il prend en charge une gamme de valeurs entières allant de ~ 2 milliards négatifs à 2 milliards positifs ou de zéro à environ 4 milliards (non signés). Ainsi, même si vous considérez l'un des plus grands employeurs américains comme Walmart, qui compte environ 2,2 millions d'employés, l'utilisation d'un type de données entier pour la colonne employeeCount serait inutile. Dans un tel cas, vous utilisez mediumint (qui prend en charge de 0 à 16 millions (non signé)) par exemple. Ceci dit, si votre plage de valeurs est exceptionnellement grande, vous pouvez envisager bigint qui, comme vous pouvez le voir dans les notes de Daniel, prend en charge une plage de valeurs plus grande que celle que j'ai envie de déchiffrer.

6 votes

Dans votre exemple de WalMart avec 2,2 millions d'employés actifs, je pense qu'avec une rotation du personnel d'environ 50% par an, un type INT sur EmployeeID serait le minimum nécessaire. Qu'en pensez-vous ? Je vous l'accorde - pour la plupart des entreprises normales, un type INT serait beaucoup trop important !

2voto

Vikram Rathaur Points 21

Type de données Plage Stockage

bigint  -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)    8 Bytes
int -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)    4 Bytes
smallint    -2^15 (-32,768) to 2^15-1 (32,767)  2 Bytes
tinyint 0 to 255    1 Byte

Exemple

L'exemple suivant crée une table en utilisant les types de données bigint, int, smallint et tinyint. Les valeurs sont insérées dans chaque colonne et renvoyées dans l'instruction SELECT.

CREATE TABLE dbo.MyTable
(
  MyBigIntColumn bigint
 ,MyIntColumn  int
 ,MySmallIntColumn smallint
 ,MyTinyIntColumn tinyint
);

GO

INSERT INTO dbo.MyTable VALUES (9223372036854775807, 214483647,32767,255);
 GO
SELECT MyBigIntColumn, MyIntColumn, MySmallIntColumn, MyTinyIntColumn
FROM dbo.MyTable;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X