char(或是nchar)與varchar(或是nvarchar)是數(shù)據(jù)庫中最常見的用于存儲字符數(shù)據(jù)的數(shù)據(jù)類型,由于它們大多數(shù)特性相同,因此在選擇使用哪種類型字符數(shù)據(jù)時(shí),
可能會有一些疑惑。不過,通過一些比較和測試,還是可以較為容易地根據(jù)實(shí)際的需要來選擇它們。
1. char與varchar的比較
下面是使用char與varcahr的一些結(jié)果。
(1)數(shù)據(jù)存儲開銷。
a. 每個(gè)varchar列需要額外的兩個(gè)字節(jié),用于反映存儲的數(shù)據(jù)的長度。
b. 每個(gè)可為NULL的char列,需要一些字節(jié)(空位圖)來反應(yīng)數(shù)據(jù)的為空性。
c. 無論實(shí)際數(shù)據(jù)的長度是多少,char按照定義的長度分配存儲空間。
d. varchar根據(jù)實(shí)際存儲的數(shù)據(jù)長度來分配數(shù)據(jù)存儲空間。
(2) NULL值。
a. char列的NULL值占用存儲空間。
b. varcahr列的NULL值不占用存儲空間。
c. 插入同樣數(shù)量的NULL值,varchar列的插入效率明顯高出char列。
(3) 插入數(shù)據(jù)。無論插入數(shù)據(jù)涉及的列是否建立索引,char的效率都明顯低于varchar。
(4) 更新數(shù)據(jù)
如果更新的列上未建立索引,則char的效率低于varchar,差異不大;建立索引的話,效率差異較大。
(5) 修改結(jié)構(gòu)
a. 無論增加或是刪除的列的類型是char還是varchar,操作都能較快的完成,而且效率上沒有什么差異。
b. 對于增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費(fèi)時(shí)間,而修改char列需要花費(fèi)很長的時(shí)間。
(6) 數(shù)據(jù)檢索。無論是否通過索引,varchar類型的數(shù)據(jù)檢索略優(yōu)于char的掃描。
2. 選擇char還是選擇varchar的建議
(1) 適宜于char的情況:
a. 列中的各行數(shù)據(jù)長度基本一致,長度變化不超過50字節(jié);
b. 數(shù)據(jù)變更頻繁,數(shù)據(jù)檢索的需求較少。
c. 列的長度不會變化,修改char類型列的寬度的代價(jià)比較大。
d. 列中不會出現(xiàn)大量的NULL值。
e. 列上不需要建立過多的索引,過多的索引對char列的數(shù)據(jù)變更影響較大。
(2) 適宜于archar的情況;
a. 列中的各行數(shù)據(jù)的長度差異比較大。
b. 列中數(shù)據(jù)的更新非常少,但查詢非常頻繁。
c. 列中經(jīng)常沒有數(shù)據(jù),為NULL值或?yàn)榭罩怠?/p>