Qual è la differenza tra tinyint, smallint, mediumint, bigint e int in MySQL?


368

Qual è la differenza tra tinyint, smallint, mediumint, bigint e int in MySQL?

In quali casi devono essere utilizzati?

Risposte:


575

Occupano diverse quantità di spazio e hanno diversi intervalli di valori accettabili.

Ecco le dimensioni e gli intervalli di valori per SQL Server , altri RDBMS hanno una documentazione simile:

Risulta che usano tutti la stessa specifica (con alcune eccezioni minori indicate di seguito) ma supportano varie combinazioni di quei tipi (Oracle non incluso perché ha solo un NUMBERtipo di dati, vedi il link sopra):

             | 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

E supportano gli stessi intervalli di valori (con un'eccezione di seguito) e tutti hanno gli stessi requisiti di archiviazione:

            | 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 

I tipi "unsigned" sono disponibili solo in MySQL e gli altri usano solo gli intervalli firmati, con una notevole eccezione: tinyintin SQL Server è unsigned e ha un intervallo di valori compreso tra 0 e 255


21
Non sapevo che i tipi senza segno sono disponibili solo in MySQL, questo è un enorme vantaggio di MySQL rispetto ad altri RDBMS. Qualcosa è cambiato dal giorno in cui questa risposta è stata pubblicata?
biox,

3
@Daniel, cosa stanno pensando, perché ce n'è uno per 3 byte ma nessuno per 6 byte?
Pacerier

10
@Pacerier probabilmente non sapevano come chiamarlo :))
Mihai Matei

5
Avrebbero dovuto chiamata che un bigint e al posto di bigint, un humongousint.
MarioDS

5
greatint potrebbe essere un'opzione, essendo Oracle un'azienda statunitense. :)
osiris,

32

la dimensione della memoria richiesta e quanto grandi possono essere i numeri

su SQL Server

tinyint 1 byte, da 0 a 255

piccolo 2 byte, -2 ^ 15 (-32.768) a 2 ^ 15-1 (32.767)

int 4 byte, -2 ^ 31 (-2.147.483.648) a 2 ^ 31-1 (2.147.483.647)

bigint 8 byte, -2 ^ 63 (-9.223.372.036.854.775.808) a 2 ^ 63-1 (9.223.372.036.854.775.807)

puoi memorizzare il numero 1 in tutti e 4, ma un bigint utilizzerà 8 byte mentre un tinyint utilizzerà 1 byte


15

Questi sembrano essere tipi di dati MySQL.

Secondo la documentazione che prendono:

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

E, naturalmente, accetta intervalli di numeri sempre più grandi.


9

Quando si arriva all'utilizzo nel mondo reale di questi tipi di dati, è molto importante comprendere che l'utilizzo di determinati tipi di numeri interi potrebbe essere solo un eccesso o un uso insufficiente. Ad esempio, l'utilizzo di un tipo di dati intero per employeeCount in una tabella indica che il dipendente potrebbe essere un eccessivo poiché supporta un intervallo di valori interi da ~ 2 miliardi negativi a 2 miliardi positivi o da zero a circa 4 miliardi (senza segno). Pertanto, anche se si considera uno dei maggiori datori di lavoro degli Stati Uniti come Walmart con circa 2,2 milioni di dipendenti che utilizzano un tipo di dati intero per la colonna Employer Account non sarebbe necessario. In tal caso, ad esempio, si utilizza mediumint (che supporta da 0 a 16 milioni (senza segno)). Detto questo, se si prevede che il tuo raggio d'azione sia insolitamente ampio, potresti prendere in considerazione bigint che, come puoi vedere da Daniel '


2
Nel tuo esempio di WalMart con 2,2 milioni di dipendenti attivi, penso che con un turnover del personale di circa il 50% annuo, un tipo INT su EmployeeID sarebbe il minimo necessario. Cosa ne pensate? Concesso: per la maggior parte delle aziende normali un tipo INT sarebbe IN MODO eccessivo!
Kiltannen,

3

La differenza è la quantità di memoria allocata a ciascun numero intero e la quantità che possono contenere ciascuno di essi.


2

Tipo di dati 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

Esempio

L'esempio seguente crea una tabella usando i tipi di dati bigint, int, smallint e tinyint. I valori vengono inseriti in ogni colonna e restituiti nell'istruzione 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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.