2010-06-28 11 views
143

Mi chiedevo che cosa la differenza tra BigInt, MediumInt e Int sono ... sembrerebbe ovvio che avrebbero permesso per i numeri più grandi; tuttavia, posso creare un Int(20) o un BigInt(20) e sembrerebbe che non si tratti necessariamente di dimensioni.Tipi in MySQL: bigint (20) vs Int (20)

Alcuni intuizione sarebbe impressionante, solo tipo di curiosi. Sono stato con MySQL per un po 'e cercando di applicare le esigenze di business al momento di scegliere i tipi, ma non ho mai capito questo aspetto.

risposta

304

Vedi http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

  • INT è un intero con segno a quattro byte.

  • BIGINT è un intero firmato otto byte.

Entrambi accettano non più e non meno valori di quelli che possono essere memorizzati nel rispettivo numero di byte. Ciò significa 2 valori in un INT e 2 valori in un BIGINT.

Il 20 in INT(20) e BIGINT(20) significa quasi nulla. È un suggerimento per la larghezza del display. Non ha nulla a che fare con l'archiviazione, né l'intervallo di valori che la colonna accetterà.

In pratica, essa riguarda solo l'opzione ZEROFILL:

CREATE TABLE foo (bar INT(20) ZEROFILL); 
INSERT INTO foo (bar) VALUES (1234); 
SELECT bar from foo; 

+----------------------+ 
| bar     | 
+----------------------+ 
| 000000000000000| 
+----------------------+ 

È una fonte comune di confusione per gli utenti MySQL vedere INT(20) e assumono è un limite di dimensione, qualcosa di analogo CHAR(20). Questo non è il caso.

+1

Wow, questo post ha chiarito perfettamente la mia confusione su questo argomento. Sembra una scelta strana da parte degli sviluppatori - come avrei immaginato fosse larghezza + valore massimo, o bit/ecc. – Sh4d0wsPlyr

+7

'interessa solo l'opzione ZEROFILL:' ora la mia curiosità termina – Umair

+2

Mi piacerebbe davvero che avessero progettato la sintassi con il display con ZEROFILL invece di INT. Esempio: 'bar INT ZEROFILL (20)'. Sarebbe stato molto più chiaro. Ma quella decisione è stata presa molto tempo fa, e cambiandola ora si rompono milioni di installazioni di database. –

34

Il numero in parentesi in una dichiarazione di tipo è larghezza di visualizzazione, che è correlato alla gamma di valori che possono essere memorizzati in un tipo di dati. Solo perché è possibile dichiarare Int(20) non significa che è possibile memorizzare i valori fino a 10^20 in esso:

[...] Questa larghezza del display opzionale può essere utilizzata dalle applicazioni per visualizzare i valori interi di larghezza inferiore a la larghezza specificata per la colonna per left-padding con spazi. ...

La larghezza di visualizzazione non vincola l'intervallo di valori che possono essere memorizzati nella colonna, né il numero di cifre che vengono visualizzate per valori di larghezza superiore a quella specificata per la colonna. Ad esempio, una colonna specificata come SMALLINT (3) presenta la consueta gamma SMALLINT -32768 32767 e valori al di fuori dell'intervallo consentito da tre caratteri vengono visualizzati utilizzando più di tre caratteri.

Per un elenco dei valori minimi e massimi che possono essere memorizzati in ciascun tipo di dati MySQL, vedere here.

+1

Vuoi dire [qui] (http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)? – WAF

12

Quote:

Il "BIGINT (20)" specifica non è un limite cifre. Significa solo che quando vengono visualizzati i dati, se utilizza meno di 20 cifre, verrà lasciato a sinistra con zeri. 2^64 è il limite rigido per il tipo BIGINT e ha 20 cifre, quindi BIGINT (20) significa semplicemente che tutto meno di 10^20 sarà lasciato a sinistra con spazi sul display.

+2

2^64 (senza segno) ha in realtà 21 cifre. BIGINT (20) è pericoloso. Le persone che lo usano sembrano giustificare il loro uso sull'idea che 2^64 si adatti a 20 cifre decimali. In questo caso, perché specificare un limite di larghezza? A quanto pare, anche questo non è corretto. Sono necessarie 21 cifre per visualizzare correttamente 2^64. –

1

volevo aggiungere un punto in più è, se si archiviano davvero un gran numero come 902.054.990.011.312 allora si può facilmente vedere la differenza di INT(20) e BIGINT(20). Si consiglia di conservare in BIGINT.

0

Per quanto ne so, c'è solo una piccola differenza quando si cerca di inserire un valore fuori dalla portata.

Negli esempi userò 401421228216, che è 101110101110110100100011101100010111000 (lunghezza caratteri)

  • Se si dispone INT(20) per sistema significa allocare nella memoria minima 20 bit. Ma se si inserisce il valore che più grande di 2^20, verrà memorizzato con successo, solo se si tratta di meno di INT(32) -> 2147483647 (o 2 * INT(32) -> 4294967295 per UNSIGNED)

Esempio:

mysql> describe `test`; 
+-------+------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+------------------+------+-----+---------+-------+ 
| id | int(20) unsigned | YES |  | NULL |  | 
+-------+------------------+------+-----+---------+-------+ 
1 row in set (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
ERROR 1264 (22003): Out of range value for column 'id' at row 1 

mysql> SET sql_mode = ''; 
Query OK, 0 rows affected, 1 warning (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
Query OK, 1 row affected, 1 warning (0,06 sec) 

mysql> SELECT * FROM `test`; 
+------------+ 
| id   | 
+------------+ 
| 4294967295 | 
+------------+ 
1 row in set (0,00 sec) 
  • Se hai BIGINT(20) per sistema questo significa allocare in memoria minimo 20 bit. Ma se si inserisce il valore che più grande di 2^20, esso verrà memorizzato con successo, se si tratta di meno di BIGINT(64) -> 9223372036854775807 (o 2 * BIGINT(64) -> 18446744073709551615 per UNSIGNED)

Esempio:

mysql> describe `test`; 
+-------+---------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+---------------------+------+-----+---------+-------+ 
| id | bigint(20) unsigned | YES |  | NULL |  | 
+-------+---------------------+------+-----+---------+-------+ 
1 row in set (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
Query OK, 1 row affected (0,04 sec) 

mysql> SELECT * FROM `test`; 
+--------------+ 
| id   | 
+--------------+ 
| 401421228216 | 
+--------------+ 
1 row in set (0,00 sec)