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