Mysql
 sql >> Database >  >> RDS >> Mysql

Differenza tra VARCHAR e TEXT in MySQL

TL;DR

TEXT

  • fissa la dimensione massima di 65535 caratteri (non è possibile limitare la dimensione massima)
  • prende 2 + c byte di spazio su disco, dove c è 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 (per M ≤ 255) o 2 + c (per 256 ≤ M ≤ 65535) byte di spazio su disco dove c è 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 .