Общото правило е да изберете CHAR ако всички редове ще имат близка до еднаква дължина . Изберете VARCHAR (или NVARCHAR ), когато дължината варира значително. CHAR може също да е малко по-бърз, защото всички редове са с еднаква дължина.
Тя варира в зависимост от имплементацията на DB, но обикновено VARCHAR (или NVARCHAR ) използва още един или два байта за съхранение (за дължина или прекратяване) в допълнение към действителните данни. Така че (ако приемем, че използвате еднобайтов набор от знаци), съхраняване на думата "FooBar"
- CHAR(6) =6 байта (без допълнителни разходи)
- VARCHAR(100) =8 байта (2 байта режийни)
- CHAR(10) =10 байта (4 байта отпадъци)
Долният ред е CHAR може бъдете по-бързи и още икономични на пространството за данни с относително еднаква дължина (в рамките на разлика в дължината от два знака).
Забележка :Microsoft SQL има 2 байта допълнителни разходи за VARCHAR. Това може да варира от DB до DB, но обикновено има най-малко 1 байт служебна информация, необходима за указване на дължина или EOL на VARCHAR.
Както беше посочено от Гавън в коментарите:Нещата се променят, когато става въпрос за набори от многобайтови знаци и това е случай, когато VARCHAR става много по-добър избор.
Бележка за декларираната дължина на VARCHAR :Тъй като съхранява дължината на действителното съдържание, вие не губите неизползвана дължина. Така че съхраняване на 6 знака в VARCHAR(6), VARCHAR(100), или VARCHAR(MAX) използва същото количество място за съхранение. Прочетете повече за разликите при използване на VARCHAR(MAX). Декларирате максимум размер във VARCHAR, за да ограничите колко се съхранява.
В коментарите AlwaysLearning посочи, че документите на Microsoft Transact-SQL изглежда казват обратното. Предполагам, че това е грешка или поне документите са неясни.