2010-12-14 5 views

risposta

13

Questa domanda non è significativa nel contesto di SQLite in quanto supporta solo un singolo tipo di campo TEXT. La distinzione tra "larghezza fissa" e "lunghezza variabile" non esiste qui.

Mentre SQLite consente di definire un campo con un determinato tipo, tutto questo è (al massimo) imposta la preferenza di quel campo per il tipo da utilizzare quando si memorizzano dati ambigui (ad esempio, se "3" verrà archiviato come INTEGER, REAL, o TEXT). È comunque possibile memorizzare qualsiasi tipo di dati in qualsiasi campo SQLite indipendentemente dal suo tipo.

In particolare in materia di CHAR vs VARCHAR, http://www.sqlite.org/datatype3.html ci dice:

Se il tipo dichiarato della colonna contiene una qualsiasi delle stringhe "char", "CLOB", o "TEXT" allora che la colonna ha l'affinità TEXT . Si noti che il tipo VARCHAR contiene la stringa "CHAR" e viene quindi assegnato affinità TEXT.

+0

Ma potrei anche rimuovere tutte le colonne text/varchar/char da una tabella. Sarebbe quindi a larghezza fissa. Le mie domande sono se questo consentirà o meno una ricerca più rapida della colonna (a parte il fatto che è di dimensioni ridotte). – David

+5

No, non lo farebbe. Come spiega il documento collegato, SQLite utilizza tipi di campi dinamici. Anche se dichiari un campo come INTEGER, puoi comunque memorizzare float, testo o anche blob. La dichiarazione "INTEGER" fornisce al campo una preferenza per l'archiviazione dei dati come numeri interi, ma non lo limita a farlo. Sarebbe comunque una colonna/record a larghezza variabile. (E questo è anche ignorando i dettagli che INTEGER non è in formato fisso in SQLite comunque ...) –

5

Solo dal SQLite uses variable-length records, suppongo che non abbiano implementato l'ottimizzazione della ricerca a larghezza fissa quando le righe hanno la stessa lunghezza.

E come Dave ha sottolineato, si può ancora memorizzare il testo nei campi INT. A partire da SQLite never truncates data, ciò significa che SQLite consente una colonna di larghezza apparentemente fissa come INT per memorizzare anche dati di lunghezza variabile. Quindi è impossibile implementare l'ottimizzazione della ricerca a larghezza fissa.