Obecným pravidlem je vybrat CHAR pokud budou mít všechny řádky téměř stejnou délku . Vyberte VARCHAR (nebo NVARCHAR ), když se délka liší výrazně. CHAR může být také o něco rychlejší, protože všechny řádky mají stejnou délku.
Liší se podle implementace DB, ale obecně platí, že VARCHAR (nebo NVARCHAR ) používá jeden nebo dva další bajty úložiště (pro délku nebo ukončení) kromě skutečných dat. Takže (za předpokladu, že používáte jednobajtovou znakovou sadu) uložení slova "FooBar"
- CHAR(6) =6 bajtů (žádná režie)
- VARCHAR(100) =8 bajtů (2 bajty režie)
- CHAR(10) =10 bajtů (4 bajty odpadu)
Sečteno a podtrženo je CHAR může být rychlejší a prostorově efektivní pro data relativně stejné délky (rozdíl v délce dvou znaků).
Poznámka :Microsoft SQL má 2 bajty režie pro VARCHAR. To se může lišit od DB k DB, ale obecně je potřeba alespoň 1 bajt režie k označení délky nebo EOL na VARCHAR.
Jak zdůraznil Gaven v komentářích:Věci se mění, pokud jde o vícebajtové znakové sady, a to je případ, kdy se VARCHAR stává mnohem lepší volbou.
Poznámka k deklarované délce VARCHAR :Protože ukládá délku skutečného obsahu, neztrácíte nevyužitou délku. Takže uložení 6 znaků do VARCHAR(6), VARCHAR(100), nebo VARCHAR(MAX) využívá stejné množství úložiště. Přečtěte si více o rozdílech při použití VARCHAR(MAX). Deklarujete maximum velikost ve VARCHAR, abyste omezili, kolik se uloží.
V komentářích AlwaysLearning poukázal na to, že dokumenty Microsoft Transact-SQL, zdá se, říkají opak. Navrhoval bych, že jde o chybu nebo alespoň dokumenty nejsou jasné.