TL;DR
TEXT
- fissa la dimensione massima di 65535 caratteri (non è possibile limitare la dimensione massima)
- prende 2 +
cbyte 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
Mcaratteri Mdeve essere compreso tra 1 e 65535- prende 1 +
cbyte (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
.