數據庫定義到char類(lèi)型的字段時(shí),不知道大家是否會(huì )猶豫一下,到底選char、nchar、varchar、nvarchar、text、ntext中哪一種呢?結果很可能是兩種,一種是節儉人士的選擇:最好是用定長(cháng)的,感覺(jué)比變長(cháng)能省些空間,而且處理起來(lái)會(huì )快些,無(wú)法定長(cháng)只好選用定長(cháng),并且將長(cháng)度設置盡可能地??;另一種是則是覺(jué)得無(wú)所謂,盡量用可變類(lèi)型的,長(cháng)度盡量放大些。
鑒于現在硬件像蘿卜一樣便宜的大好形勢,糾纏這樣的小問(wèn)題實(shí)在是沒(méi)多大意義,不過(guò)如果不弄清它,總覺(jué)得對不起勞累過(guò)度的CPU和硬盤(pán)。
下面開(kāi)始了(以下說(shuō)明只針對SqlServer有效):
1、當使用非unicode時(shí)慎用以下這種查詢(xún):
select f from t where f = N'xx'
原因:無(wú)法利用到索引,因為數據庫會(huì )將f先轉換到unicode再和N'xx'比較
2、char 和相同長(cháng)度的varchar處理速度差不多(后面還有說(shuō)明)
3、varchar的長(cháng)度不會(huì )影響處理速度?。。。春竺娼忉?zhuān)?
4、索引中列總長(cháng)度最多支持總為900字節,所以長(cháng)度大于900的varchar、char和大于450的nvarchar,nchar將無(wú)法創(chuàng )建索引
5、text、ntext上是無(wú)法創(chuàng )建索引的
6、O/R Mapping中對應實(shí)體的屬性類(lèi)型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性來(lái)說(shuō),可變長(cháng)度的類(lèi)型更加吻合
7、一般基礎資料表中的name在實(shí)際查詢(xún)中基本上全部是使用like '%xx%'這種方式,而這種方式是無(wú)法利用索引的,所以如果對于此種字段,索引建了也白建
8、其它一些像remark的字段則是根本不需要查詢(xún)的,所以不需要索引
9、varchar的存放和string是一樣原理的,即length {block}這種方式,所以varchar的長(cháng)度和它實(shí)際占用空間是無(wú)關(guān)的
10、對于固定長(cháng)度的字段,是需要額外空間來(lái)存放NULL標識的,所以如果一個(gè)char字段中出現非常多的NULL,那么很不幸,你的占用空間比沒(méi)有NULL的大(但這個(gè)大并不是大太多,因為NULL標識是用bit存放的,可是如果你一行中只有你一個(gè)NULL需要標識,那么你就白白浪費1byte空間了,罪過(guò)罪過(guò)?。?,這時(shí)候,你可以使用特殊標識來(lái)存放,如:'NV'
11、同上,所以對于這種NULL查詢(xún),索引是無(wú)法生效的,假如你使用了NULL標識替代的話(huà),那么恭喜你,你可以利用到索引了
12、char和varchar的比較成本是一樣的,現在關(guān)鍵就看它們的索引查找的成本了,因為查找策略都一樣,因此應該比較誰(shuí)占用空間小。在存放相同數量的字符情況下,如果數量小,那么char占用長(cháng)度是小于varchar的,但如果數量稍大,則varchar完全可能小于char,而且要看實(shí)際填充數值的充實(shí)度,比如說(shuō)varchar(3)和char(3),那么理論上應該是char快了,但如果是char(10)和varchar(10),充實(shí)度只有30%的情況下,理論上就應該是varchar快了。因為varchar需要額外空間存放塊長(cháng)度,所以只要length(1-fillfactor)大于這個(gè)存放空間(好像是2字節),那么它就會(huì )比相同長(cháng)度的char快了。
13、nvarchar比varchar要慢上一些,而且對于非unicode字符它會(huì )占用雙倍的空間,那么這么一種類(lèi)型推出來(lái)是為什么呢?對,就是為了國際化,對于unicode類(lèi)型的數據,排序規則對它們是不起作用的,而非unicode字符在處理不同語(yǔ)言的數據時(shí),必須指定排序規則才能正常工作,所以n類(lèi)型就這么一點(diǎn)好處。
總結陳詞:
1、如果數據量非常大,又能100%確定長(cháng)度且保存只是ansi字符,那么char
2、能確定長(cháng)度又不一定是ansi字符或者,那么用nchar;
3、不確定長(cháng)度,要查詢(xún)且希望利用索引的話(huà),用nvarchar類(lèi)型吧,將它們設到400;
4、不查詢(xún)的話(huà)沒(méi)什么好說(shuō)的,用nvarchar(4000)
5、性格豪爽的可以只用3和4,偶爾用用1,畢竟這是一種額外說(shuō)明,等于告訴別人說(shuō),我一定需要長(cháng)度為X位的數據
這樣一來(lái),生活是不是變成美好多了? 如果還有沒(méi)明白的,那么還是省點(diǎn)錢(qián)去買(mǎi)蘿卜吧。

聯(lián)系客服