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

368

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

Dans quels cas faut-il les utiliser?

Sein Kraft
la source

Réponses:

575

Ils occupent différentes quantités d'espace et ont différentes plages de valeurs acceptables.

Voici les tailles et les plages de valeurs pour SQL Server , les 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 prennent en charge diverses combinaisons de ces types (Oracle n'est pas inclus car il n'a qu'un NUMBERtype de données, 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

Et ils prennent en charge les mêmes plages de valeurs (à une exception près ci-dessous) et ont tous les mêmes exigences 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" sont uniquement disponibles dans MySQL, et le reste utilise simplement les plages signées, à une exception notable: tinyintdans SQL Server, il n'est pas signé et a une plage de valeurs de 0 à 255

Daniel DiPaolo
la source
21
Je ne savais pas que les types non signés sont disponibles uniquement dans MySQL, c'est un énorme avantage de MySQL par rapport aux autres SGBDR. Quelque chose a changé depuis le jour où cette réponse a été publiée?
biox
3
@Daniel, à quoi pensent-ils, pourquoi y en a-t-il un pour 3 octets mais aucun pour 6 octets?
Pacerier
10
@Pacerier probablement ils ne savaient pas comment le nommer :))
Mihai Matei
5
Ils auraient dû appeler ça un bigint et au lieu de bigint, un humongousint.
MarioDS
5
greatint pourrait être une option, étant Oracle une entreprise américaine. :)
osiris
32

la taille de stockage requise et la taille des nombres

sur SQL Server

tinyint 1 octet, 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 numéro 1 dans les 4, mais un bigint utilisera 8 octets tandis qu'un tinyint utilisera 1 octet

SQLMenace
la source
15

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

Selon la 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, acceptez des plages de nombres de plus en plus grandes.

ANeves
la source
9

Quand il s'agit de l'utilisation réelle de ces types de données, il est très important que vous compreniez que l'utilisation de certains types entiers pourrait simplement être un excès ou une sous-utilisation. Par exemple, l'utilisation d'un type de données entier pour employeeCount dans un tableau indique que l'employé peut être un excès car il prend en charge une plage de valeurs entières de ~ 2 milliards à 2 milliards positifs ou de zéro à environ 4 milliards (non signé). Donc, même si vous considérez que l'un des plus gros employeurs des États-Unis, comme Walmart, avec environ 2,2 millions d'employés, utiliser un type de données entier pour la colonne employeeCount serait inutile. Dans un tel cas, vous utilisez par exemple mediumint (qui prend en charge de 0 à 16 millions (non signé)). Cela dit, si votre gamme est censée être inhabituellement grande, vous pourriez envisager un gros point qui, comme vous pouvez le voir chez Daniel '

Anil M
la source
2
Dans votre exemple de WalMart avec 2,2 millions d'employés actifs - je pense qu'avec un roulement de personnel d'environ 50% par an, un type INT sur EmployeeID serait le minimum requis. Que pensez-vous tous? Accordé - pour la plupart des entreprises normales, un type INT serait beaucoup trop exagéré!
kiltannen
3

La différence est la quantité de mémoire allouée à chaque entier et le nombre qu'ils peuvent chacun stocker.

Alexsander Akers
la source
2

Type de données Range Storage

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 à l'aide des types de données bigint, int, smallint et tinyint. Des 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;
Vikram Rathaur
la source