La regola generale è scegliere CHAR se tutte le righe avranno quasi la stessa lunghezza . Scegli VARCHAR (o NVARCHAR ) quando la lunghezza varia in modo significativo. CHAR potrebbe anche essere un po' più veloce perché tutte le righe hanno la stessa lunghezza.
Varia in base all'implementazione del DB, ma generalmente VARCHAR (o NVARCHAR ) utilizza uno o due ulteriori byte di archiviazione (per lunghezza o terminazione) oltre ai dati effettivi. Quindi (supponendo che tu stia utilizzando un set di caratteri a un byte) memorizzare la parola "FooBar"
- CHAR(6) =6 byte (nessun sovraccarico)
- VARCHAR(100) =8 byte (2 byte di sovraccarico)
- CHAR(10) =10 byte (4 byte di scarto)
La linea di fondo è CHAR può essere più veloce e più efficiente di spazio per dati di lunghezza relativamente uguale (con una differenza di lunghezza di due caratteri).
Nota :Microsoft SQL ha 2 byte di sovraccarico per un VARCHAR. Questo può variare da DB a DB, ma in genere è necessario almeno 1 byte di sovraccarico per indicare la lunghezza o l'EOL su un VARCHAR.
Come sottolineato da Gaven nei commenti:le cose cambiano quando si tratta di set di caratteri multibyte, ed è un caso in cui VARCHAR diventa una scelta molto migliore.
Una nota sulla lunghezza dichiarata del VARCHAR :poiché memorizza la lunghezza del contenuto effettivo, non sprechi la lunghezza inutilizzata. Quindi memorizzare 6 caratteri in VARCHAR(6), VARCHAR(100), o VARCHAR(MAX) utilizza la stessa quantità di spazio di archiviazione. Ulteriori informazioni sulle differenze quando si utilizza VARCHAR(MAX). Dichiari un massimo size in VARCHAR per limitare la quantità memorizzata.
Nei commenti AlwaysLearning ha sottolineato che i documenti Microsoft Transact-SQL sembrano dire il contrario. Suggerirei che si tratta di un errore o almeno i documenti non sono chiari.