TL;DR
TEXT
- fissa la dimensione massima di 65535 caratteri (non è possibile limitare la dimensione massima)
- prende 2 +
c
byte di spazio su disco, dovec
è la lunghezza della stringa memorizzata. - non può essere (completamente) parte di un indice. Sarebbe necessario specificare una lunghezza del prefisso.
VARCHAR(M)
- dimensione massima variabile di
M
caratteri M
deve essere compreso tra 1 e 65535- prende 1 +
c
byte (perM
≤ 255) o 2 +c
(per 256 ≤M
≤ 65535) byte di spazio su disco dovec
è la lunghezza della stringa memorizzata - può far parte di un indice
Maggiori dettagli
TEXT
ha un corretto dimensione massima di 2¹⁶-1 = 65535
caratteri.VARCHAR
ha una variabile dimensione massima M
fino a M = 2¹⁶-1
.
Quindi non puoi scegliere la dimensione di TEXT
ma puoi per un VARCHAR
.
L'altra differenza è che non puoi inserire un indice (tranne un indice fulltext) su un TEXT
colonna.
Quindi se vuoi avere un indice sulla colonna, devi usare VARCHAR
. Ma nota che anche la lunghezza di un indice è limitata, quindi se il tuo VARCHAR
la colonna è troppo lunga devi usare solo i primi caratteri di VARCHAR
colonna nel tuo indice (consulta la documentazione per CREATE INDEX
).
Ma vuoi anche usare VARCHAR
, se sai che la lunghezza massima della possibile stringa di input è solo M
, per esempio. un numero di telefono o un nome o qualcosa del genere. Quindi puoi utilizzare VARCHAR(30)
invece di TINYTEXT
o TEXT
e se qualcuno tenta di salvare il testo di tutti e tre i libri "Il Signore dell'Anello" nella colonna del tuo numero di telefono memorizzi solo i primi 30 caratteri :)
Modifica: Se il testo che vuoi memorizzare nel database è più lungo di 65535 caratteri, devi scegliere MEDIUMTEXT
o LONGTEXT
, ma attenzione:MEDIUMTEXT
memorizza stringhe fino a 16 MB, LONGTEXT
fino a 4 GB. Se usi LONGTEXT
e ottieni i dati tramite PHP (almeno se usi mysqli
senza store_result
), potresti ricevere un errore di allocazione della memoria, perché PHP cerca di allocare 4 GB di memoria per essere sicuro che l'intera stringa possa essere memorizzata nel buffer. Questo forse accade anche in altre lingue oltre a PHP.
Tuttavia, dovresti sempre controlla l'input (è troppo lungo? Contiene codice strano?) prima memorizzandolo nel database.
Avviso:per entrambi i tipi, lo spazio su disco richiesto dipende solo dalla lunghezza della stringa memorizzata e non dalla lunghezza massima.
Es. se usi il set di caratteri latin1 e memorizzi il testo "Test" in VARCHAR(30)
, VARCHAR(100)
e TINYTEXT
, richiede sempre 5 byte (1 byte per memorizzare la lunghezza della stringa e 1 byte per ogni carattere). Se memorizzi lo stesso testo in un VARCHAR(2000)
o un TEXT
colonna, richiederebbe anche lo stesso spazio, ma, in questo caso, sarebbe 6 byte (2 byte per memorizzare la lunghezza della stringa e 1 byte per ogni carattere).
Per ulteriori informazioni, dai un'occhiata alla documentazione .
Infine, voglio aggiungere un avviso, che entrambi, TEXT
e VARCHAR
sono tipi di dati a lunghezza variabile e quindi molto probabilmente riducono al minimo lo spazio necessario per archiviare i dati. Ma questo viene fornito con un compromesso per le prestazioni. Se hai bisogno di prestazioni migliori, devi utilizzare un tipo di lunghezza fissa come CHAR
. Puoi leggere ulteriori informazioni su questo qui
.