SQL中char varchar nchar nvarchar ntext區別和使用(資料匯總)
2008年10月14日 星期二 23:57
一、SQL中char varchar nchar nvarchar ntext的區別?
???????1、CHAR。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那么不論你存儲的數據是否達到了10個字節,都要占去10個字節的空間。
??????2、VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什么“+1”呢?這一個字節用于保存實際使用了多大的長度。
??????3、TEXT。text存儲可變長度的非Unicode數據,最大長度為2^31-1(2,147,483,647)個字符。
??????4、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個“N”。它表示存儲的是Unicode數據類型的字符。我們知道字符 中,英文字符只需要一個字節存儲就足夠了,但漢字眾多,需要兩個字節存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這 種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。nchar、nvarchar的長度是在1到4000之間。和 char、varchar比較起來,nchar、nvarchar則最多存儲4000個字符,不論是英文還是漢字;而char、varchar最多能存儲 8000個英文,4000個漢字。可以看出使用nchar、nvarchar數據類型時不用擔心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數量 上有些損失。
??????所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數字,用char/varchar。
二、char、nchar、varchar與nvarchar數據類型定義:
char[(n)]
???長度為 n 個字節的固定長度且非 Unicode 的字符數據。n 必須是一個介于 1 和 8,000 之間的數值。存儲大小為 n 個字節。
char 在 SQL-92 中的同義詞為 character。
nchar(n)
???包含 n 個字符的固定長度 Unicode 字符數據。n 的值必須介于 1 與 4,000 之間。存儲大小為 n 字節的兩倍。nchar 在 SQL-
92 中的同義詞為 national char 和 national character。
varchar[(n)]
???長度為 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介于 1 和 8,000 之間的數值。存儲大小為輸入數據的字
節的實際長度,而不是 n 個字節。所輸入的數據字符長度可以為零。varchar 在 SQL-92 中的同義詞為 char varying 或
character varying。
nvarchar(n)
????包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介于 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。
所輸入的數據字符長度可以為零。nvarchar 在 SQL-92 中的同義詞為 national char varying 和 national character varying。
注:如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果沒有使用 CAST 函數指定 n,則默認長度為 30。
-----------------------------------------------------
在這里我們必須要了解一下Unicode字符:
Unicode 定義:(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。它為每種語言中的每個字符設定了統一并且唯一的
二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。
有關unicode字符表可以參考一下:http://www.jflycn.net/unicode/
?
?Char(n)
?Varchar(n)
?Nvarchar(n)
?
N 最大值
?8000
?8000
?4000
?
數據長度
?固定(不足用空格填充)
?可變(實際數據長度)
?可變(實際數據長度)
?
可存儲最多英文(數字)
?8000
?8000
?4000
?
最多漢字數
?4000
?4000
?4000
?
英文(數字)所占字節
?1
?1
?2
?
漢字所占字節
?2
?2
?2
?
檢索速度
?快
?慢
?慢
?
------------------------------------------------------
三、char、nchar、varchar與nvarchar數據類型使用區別:
支持多語言的站點應考慮使用 Unicode nchar 或 nvarchar 數據類型以盡量減少字符轉換問題。
如果希望列中的數據值大小接近一致,請使用 char。
如果希望列中的數據值大小顯著不同,請使用 varchar。
如果希望列中所有數據項的大小接近一致,則使用 nchar。
如果希望列中數據項的大小差異很大,則使用 nvarchar。
如果執行 CREATE TABLE 或 ALTER TABLE 時 SET ANSI_PADDING 為 OFF,則一個定義為 NULL 的 char 列將被作為 varchar 處理。
當排序規則代碼頁使用雙字節字符時,存儲大小仍然為 n 個字節。根據字符串的不同,n 個字節的存儲大小可能小于 n 個字符。
四、char、nchar、varchar、nvarchar,對比那個好
數據庫定義到char類型的字段時,不知道大家是否會猶豫一下,到底選char、nchar、varchar、nvarchar、
text、ntext中哪一種呢?結果很可能是兩種,一種是節儉人士的選擇:最好是用定長的,感覺比變長能省些空
間,而且處理起來會快些,無法定長只好選用定長,并且將長度設置盡可能地小;另一種是則是覺得無所謂,
盡量用可變類型的,長度盡量放大些。
鑒于現在硬件像蘿卜一樣便宜的大好形勢,糾纏這樣的小問題實在是沒多大意義,不過如果不弄清它,
總覺得對不起勞累過度的CPU和硬盤。
下面開始了(以下說明只針對SqlServer有效):
1、當使用非unicode時慎用以下這種查詢: select f from t where f = N'xx'????原因:無法利用到索引,因為數據庫會將f先轉換到unicode再和N'xx'比較
2、char 和相同長度的varchar處理速度差不多(后面還有說明)
3、varchar的長度不會影響處理速度!!!
4、索引中列總長度最多支持總為900字節,所以長度大于900的varchar、char和大于450的varchar,nchar
將無法創建索引
5、text、ntext上是無法創建索引的
6、O/R Mapping中對應實體的屬性類型一般是以string居多,用char[]的非常少,所以如果按mapping的
合理性來說,可變長度的類型更加吻合
7、一般基礎資料表中的name在實際查詢中基本上全部是使用like '%xx%'這種方式,而這種方式是無法利用索引的,所以如果對于此種字段,索引建了也白建
8、其它一些像remark的字段則是根本不需要查詢的,所以不需要索引
9、varchar的存放和string是一樣原理的,即length {block}這種方式,所以varchar的長度和它實際占用
空間是無關的
10、對于固定長度的字段,是需要額外空間來存放NULL標識的,所以如果一個char字段中出現非常多的NULL,那么很不幸,你的占用空間比沒有NULL的大(但這個大并不是大太多,因為NULL標識是用bit存放的,可是如果你一行中只有你一個NULL需要標識,那么你就白白浪費1byte空間了,罪過罪過!),這時候,你可以使用特殊標識來存放,如:'NV'
11、同上,所以對于這種NULL查詢,索引是無法生效的,假如你使用了NULL標識替代的話,那么恭喜你,你可以利用到索引了
12、char和varchar的比較成本是一樣的,現在關鍵就看它們的索引查找的成本了,因為查找策略都一樣,因此應該比較誰占用空間小。在存放相同數量的字符情況下,如果數量小,那么char占用長度是小于varchar
的,但如果數量稍大,則varchar完全可能小于char,而且要看實際填充數值的充實度,比如說varchar(3)
和char(3),那么理論上應該是char快了,但如果是char(10)和varchar(10),充實度只有30%的情況下,
理論上就應該是varchar快了。因為varchar需要額外空間存放塊長度,所以只要length(1-fillfactor)
大于這個存放空間(好像是2字節),那么它就會比相同長度的char快了。
13、nvarchar比varchar要慢上一些,而且對于非unicode字符它會占用雙倍的空間,那么這么一種類型
推出來是為什么呢?對,就是為了國際化,對于unicode類型的數據,排序規則對它們是不起作用的,
而非unicode字符在處理不同語言的數據時,必須指定排序規則才能正常工作,所以n類型就這么一點好處。
總結陳詞:
1、如果數據量非常大,又能100%確定長度且保存只是ansi字符,那么char
2、能確定長度又不一定是ansi字符或者,那么用nchar;
3、不確定長度,要查詢且希望利用索引的話,用nvarchar類型吧,將它們設到400;
4、不查詢的話沒什么好說的,用nvarchar(4000)
5、性格豪爽的可以只用3和4,偶爾用用1,畢竟這是一種額外說明,等于告訴別人說,我一定需要長度
為X位的數據
五、SQL Server中,varchar和nvarchar如何選擇?
varchar在SQL Server中是采用單字節來存儲數據的,nvarchar是使用Unico來存儲數據的.中文字符存儲到SQL Server中會保存為兩個字節(一般采用Unico編碼),英文字符保存到數據庫中,如果字段的類型為varchar,則只會占用一個字節,而如果字段 的類型為nvarchar,則會占用兩個字節.
正常情況下,我們使用varchar也可以存儲中文字符,但是如果遇到操作系統是英文操 作系統并且對中文字體的支持不全面時, 在SQL Server存儲中文字符為varchar就會出現亂碼(顯示為??).而且正常情況下,主機都會支持中文的環境,所以如果使用varchar來存儲數 據,在開發階段是發現不了的.多數情況下,在布署的時候也不會有問題.
但是!如果布署的主機是英文操作系統,并且不支持中文環境,那問 題就出來了.所有的varchar字段在存儲中文的時候都會變成亂碼(顯示為??).而且一般情況下你不會知道這是因為你采用了錯誤的數據類型來存儲所造 成的,你會試著去裝中文字體,試著去設置操作系統的語言環境...這些都不能解決問題,唯一能解決問題的是把數據庫字段的類型個性為nvarchar(或 者nchar).對項目管理比較熟悉的朋友應該都知道,到布署階段再來修改數據庫是一個很恐怖的事情.
使用nvarchar的另一個非常好處就是在判斷字符串的時候可以不需要考慮中英文兩種字符的差別.
當然,使用nvarchar存儲英文字符會增大一倍的存儲空間.但是在存儲代價已經很低廉的情況下,優先考慮兼容性會給你帶來更多好處的.
所以在Design的時候應該盡量使用nvarchar來存儲數據.只有在你確保該字段不會保存中文的時候,才采用varchar來存儲
?
?
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jackychu/archive/2009/05/14/4183190.aspx