Qual è la dimensione massima di MySQL VARCHAR?


300

Vorrei sapere qual è la dimensione massima per un tipo MySQL VARCHAR.

Ho letto che la dimensione massima è limitata dalla dimensione della riga che è di circa 65k. Ho provato a impostare il campo su varchar(20000)ma dice che è troppo grande.

Potrei impostarlo su varchar(10000). Qual è il massimo esatto che posso impostare?


1
Un blog dettagliato: goo.gl/Hli6G3
Suresh Kamrushi,

Risposte:


293

Tieni presente che MySQL ha un limite di dimensione massima delle righe

La rappresentazione interna di una tabella MySQL ha un limite di dimensione massima delle righe di 65.535 byte, senza contare i tipi BLOB e TEXT. Le colonne BLOB e TEXT contribuiscono solo da 9 a 12 byte rispetto al limite della dimensione della riga poiché il loro contenuto viene archiviato separatamente dal resto della riga. Ulteriori informazioni sui limiti relativi al conteggio delle colonne della tabella e alle dimensioni della riga.

La dimensione massima che può essere occupata da una singola colonna è diversa prima e dopo MySQL 5.0.3

I valori nelle colonne VARCHAR sono stringhe di lunghezza variabile. La lunghezza può essere specificata come un valore compreso tra 0 e 255 prima di MySQL 5.0.3 e tra 0 e 65.535 nella versione 5.0.3 e successive. La lunghezza massima effettiva di un VARCHAR in MySQL 5.0.3 e versioni successive è soggetta alla dimensione massima della riga (65.535 byte, condivisa tra tutte le colonne) e al set di caratteri utilizzato.

Tuttavia, si noti che il limite è inferiore se si utilizza un set di caratteri multi-byte come utf8 o utf8mb4.

Utilizzare i TEXTtipi in ordine per superare il limite della dimensione della riga.

I quattro tipi di TESTO sono TINYTEXT, TEXT, MEDIUMTEXT e LONGTEXT. Questi corrispondono ai quattro tipi BLOB e hanno le stesse lunghezze massime e requisiti di archiviazione.

Maggiori dettagli sui tipi BLOB e TEXT

Ancora di più

Scopri ulteriori dettagli sui requisiti di archiviazione dei tipi di dati che si occupano dei requisiti di archiviazione per tutti i tipi di dati.


4
che cos'è una stringa "lunga"?
Richard H,

6
Cerco di evitare le colonne TEXT anche se possono causare la creazione di tabelle temporanee quando presenti e l'ordinamento
Robert Swisher,

1
Se sto prendendo varchar (200) per nome e memorizzo solo 6 caratteri in questo campo, allora quanti byte nome sarà occupato?
Paresh Gami,

2
@PareshGami - 6 + 1 = 7 caratteri! Contrariamente a CHAR, i valori VARCHAR sono memorizzati come un prefisso di lunghezza di 1 byte o 2 byte più i dati. altro ...
rajukoyilandy

58

Secondo i documenti online , esiste un limite di riga di 64 KB ed è possibile calcolare la dimensione della riga utilizzando:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Devi tenere presente che le lunghezze delle colonne non sono un mapping uno a uno delle loro dimensioni. Ad esempio, CHAR(10) CHARACTER SET utf8richiede tre byte per ciascuno dei dieci caratteri poiché quella particolare codifica deve tenere conto della proprietà di tre byte per carattere di utf8(ovvero la utf8codifica di MySQL piuttosto che "UTF-8" reale, che può avere fino a quattro byte ).

Tuttavia, se la dimensione della riga si avvicina a 64 KB, è possibile esaminare lo schema del database. È una tabella rara che deve essere così ampia in un database correttamente impostato (3NF) - è possibile, ma non molto comune.

Se si desidera utilizzare più di quello, è possibile utilizzare i tipi BLOBo TEXT. Questi non vengono conteggiati rispetto al limite di 64 KB della riga (diverso da un footprint amministrativo ridotto) ma è necessario essere consapevoli di altri problemi derivanti dal loro utilizzo, come non essere in grado di ordinare utilizzando l'intero blocco di testo oltre un certo numero di caratteri (anche se questo può essere configurato verso l'alto), forzando le tabelle temporanee su disco anziché in memoria, o dover configurare i buffer di comunicazione client e server per gestire le dimensioni in modo efficiente.

Le dimensioni consentite sono:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Hai ancora la mancata corrispondenza byte / carattere (in modo che una MEDIUMTEXT utf8colonna possa memorizzare "solo" circa mezzo milione di caratteri (16M-1)/3 = 5,592,405) , ma espande ancora notevolmente il tuo intervallo.


4
Tieni presente che i tipi di TESTO NON possono essere archiviati nelle tabelle di memoria, quindi vi è una significativa penalizzazione delle prestazioni per l'utilizzo quando un VARCHAR sarebbe sufficiente.
Camden S.

'la proprietà di tre byte per carattere di utf8' di MySql utf8 , che in realtà non è affatto utf8. In realtà il max. i byte in un carattere utf-8 sono 4 . Per questo motivo dovresti sempre impostare la codifica su utf8mb4in MySQL . utf8mb4è il nome di MySql per ciò che il resto della parola chiama utf8.
Stijn de Witt,

1
@StijndeWitt, grazie per quello. chiarito per indicare che intendevo il metodo di codifica utf8 di MySQL anziché UTF-8. In genere utilizzo la variante maiuscola per indicare "reale" UTF-8 poiché questa è la convenzione IANA accettata.
paxdiablo,

41

fonte

La lunghezza massima di un varchar è soggetta alla dimensione massima della riga in MySQL, che è 64 KB (senza contare i BLOB):

VARCHAR (65535) Tuttavia, si noti che il limite è inferiore se si utilizza un set di caratteri multi-byte:

VARCHAR (21844) SET DI CARATTERI utf8


20
Si prega di smettere di usare CHARACTER SET utf8negli esempi. Dovrebbe essere CHARACTER SET utf8mb4(se vuoi che tutto il testo Unicode sia archiviato correttamente ... e chi non lo vuole?)
Stijn de Witt

4
Per l' CHARSET=utf8mb4uso VARCHAR(16383).
Wil Moore III,

3
L'uso di utf8mb4 ti metterà contro il limite della larghezza dell'indice in una situazione in cui utf8 no. Se si esaminano i set di caratteri inclusi in utf8mb4 ma non in utf8, è possibile che l'inclusione di tutte le varie forme di geroglifici e altri insiemi di caratteri arcani non valga la pena di prestazione significativa (determinata empiricamente). Non è così tagliato e asciugato come suggerisce Stijn.
kcrossen,

Molti emoji sono presenti anche in utf8mb4 e mancano in utf8, quindi ciò potrebbe cambiare l'equazione del valore.
Brian Morearty,

23

Dalla documentazione di MySQL:

La lunghezza massima effettiva di un VARCHAR in MySQL 5.0.3 e versioni successive è soggetta alla dimensione massima della riga (65.535 byte, condivisa tra tutte le colonne) e al set di caratteri utilizzato. Ad esempio, i caratteri utf8 possono richiedere fino a tre byte per carattere, quindi una colonna VARCHAR che utilizza il set di caratteri utf8 può essere dichiarata come un massimo di 21.844 caratteri.

I limiti per VARCHAR variano a seconda del set di caratteri utilizzato. L'uso di ASCII userebbe 1 byte per carattere. Ciò significa che è possibile memorizzare 65.535 caratteri. Usando utf8 verranno utilizzati 3 byte per carattere con conseguente limite di caratteri di 21.844. MA se stai usando il moderno set di caratteri multibyte utf8mb4 che dovresti usare! Supporta emoji e altri personaggi speciali. Utilizzerà 4 byte per carattere. Ciò limiterà il numero di caratteri per tabella a 16.383. Si noti che anche altri campi come INT verranno conteggiati in base a questi limiti.

Conclusione:

utf8 massimo di 21.844 caratteri

utf8mb4 massimo di 16.383 caratteri


6

puoi anche usare MEDIUMBLOB / LONGBLOB o MEDIUMTEXT / LONGTEXT

Un tipo BLOB in MySQL può memorizzare fino a 65.534 byte, se si tenta di memorizzare più di così tanti dati MySQL troncerà i dati. MEDIUMBLOB può memorizzare fino a 16.777.213 byte e LONGBLOB può memorizzare fino a 4.294.967.292 byte.


3

Prima di Mysql versione 5.0.3, il tipo di dati Varchar può contenere 255 caratteri, ma dalla 5.0.3 può contenere 65.535 caratteri.

MA ha una limitazione della dimensione massima della riga di 65.535 byte. Significa che includendo tutte le colonne non deve essere superiore a 65.535 byte.

Nel tuo caso, è possibile che, quando si tenta di impostare più di 10000, superi oltre 65.535 e mysql restituirà l'errore.

Per maggiori informazioni: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog con esempio: http://goo.gl/Hli6G3


-5

È possibile utilizzare il TEXTtipo , che non è limitato a 64 KB.


31
Questo non risponde alla domanda.
DreamWave,

1
La tua risposta non è pertinente alla domanda.
Girish,
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.