2016-05-30 17 views
5

Sono consapevole del fatto che TEXT in MySQL può avere una lunghezza massima di 65535 caratteri.Spazio occupato dalla colonna di tipo TEXT in MySQL

Ora creo una tabella con una delle colonne come TEXT e non specificare una lunghezza. A causa della quale ci vorranno maxlength come 65535 defualt.

Tuttavia, se uno dei miei record ha un valore per la colonna TEXT con lunghezza di soli 10 caratteri, lo spazio allocato per 65535 caratteri sarà ancora riservato oppure MySQL utilizzerà solo la memoria richiesta per 10 caratteri?

risposta

6

Per il tipo di dati sarebbe come la lunghezza effettiva in byte di valore stringa + (2 byte)

Il manual dice:

tipi di stringa di lunghezza variabile vengono memorizzate mediante una lunghezza prefisso più dati . Il prefisso di lunghezza richiede da uno a quattro byte a seconda di il tipo di dati e il valore del prefisso è L (la lunghezza di byte di la stringa). Ad esempio, la memorizzazione per un valore MEDIUMTEXT richiede L byte per memorizzare il valore più tre byte per memorizzare la lunghezza del valore .

VARCHAR, VARBINARY e i tipi BLOB e TEXT sono di lunghezza variabile tipi. Per ciascuna, i requisiti di memoria dipendono da questi fattori:

  • La lunghezza effettiva del valore della colonna
  • lunghezza massima possibile del colonna
  • Il set di caratteri utilizzato per la colonna, perché alcuni insiemi di caratteri contengono caratteri multibyte

enter image description here

+0

Credo quindi più piccola la lunghezza, minore lo spazio anche se la lunghezza massima è 65535. –

+1

@NavinNagpal: - Sì, ho aggiornato la mia risposta per renderlo più chiaro :) –

1

In SQL generalmente, TESTO è una specifica al caso. I campi vengono solitamente memorizzati su disco al fine di facilitare l'accesso e l'indicizzazione, ma TEXT e BLOBS tendono ad essere memorizzati (e ignorati) in un blocco separato di spazio su disco con solo l'offset memorizzato nella riga. Pertanto, non è necessario allocare lo spazio extra. L'aggiornamento del valore si traduce semplicemente in un singolo aggiornamento di un puntatore di offset all'interno dell'area di memorizzazione della tabella principale e nel salvataggio del valore corrente all'interno del blocco - non c'è praticamente nulla da guadagnare in termini di prestazioni nel riservare spazio sufficiente per il valore massimo. Quasi sicuramente, il valore attuale viene memorizzato per occupare solo lo spazio richiesto in un dato momento. Varchars, d'altra parte, sono stati tradizionalmente memorizzati all'interno della riga effettiva e quindi sono stati assegnati la quantità massima di spazio. Questo potrebbe essere cambiato da quando le loro dimensioni sono cresciute a 16 bit o no.

Problemi correlati