數據庫中char、varchar、varchar2、nvarchar之間的關係

數據庫中的char型,用於存儲定長字符串,效率比varchar要稍高,但是,佔用空間比varchar要多。比如,存儲字符串“abc",對於CHAR (20),表示你存儲的字符將佔20個字節(包括17個空字符),而同樣的VARCHAR2 (20)則只佔用3個字節的長度,20只是最大值,當你存儲的字符小於20時,按實際長度存儲。

oracle中,會有一個varchar2型的數據類型,varchar2型與varchar型的區別:

1、varchar2把所有字符都佔兩字節處理(一般情況下),varchar只對漢字和全角等字符佔兩字節,數字,英文字符等都是一個字節;
2、VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;
3、VARCHAR2字符要用幾個字節存儲,要看數據庫使用的字符集,
大部分情況下建議使用varchar2類型,可以保證更好的兼容性。

varchar(n),nvarchar(n) 中的n怎麼解釋:
  nvarchar(n)最多能存n個字符,不區分中英文。
  varchar(n)最多能存n個字節,一箇中文是兩個字節。
所佔空間:
  nvarchar(n)一個字符會佔兩個字節空間。
  varchar(n)中文佔兩字節空間,英文佔一個。
n的取值範圍:
  nvarchar(n)   n的範圍是:1與4000之間
  varchar(n)   n的範圍是:1與8000之間
n的大小是否會影響性能:
  varchar及nvarchar裏的長度 n 不會影響空間大小及性能。除非n是max並且內容大於4000或8000
  設置n更多的是業務需要,如限制身份證只能輸入18位,再多就報錯,或者防止惡意攻擊撐爆硬盤。對空間及性能都沒有影響
n設置多大比較好:
  既然對空間及性能都沒有影響,那我們只要考慮業務需要就可以了,我分析過微軟的數據庫,大都設置爲:256,也會看到64,128,512,max等,可能是便於記憶吧。
varchar(n),nvarchar(n)存儲空間舉例解釋:
  包含 n 個字符的可變長度 Unicode 字符數據。字節的存儲大小是所輸入字符個數的兩倍。
  兩字段分別有字段值:我和coffee
  那麼varchar字段佔2×2+6=10個字節的存儲空間,而nvarchar字段佔8×2=16個字節的存儲空間。
  如字段值只是英文可選擇varchar,而字段值存在較多的雙字節(中文、韓文等)字符時用nvarchar。
varchar和nvarchar如何選擇?
  varchar在SQL Server中是採用單字節來存儲數據的,nvarchar是使用Unicode來存儲數據的.中文字符存儲到SQL Server中會保存爲兩個字節(一般採用Unicode編碼),英文字符保存到數據庫中,如果字段的類型爲varchar,則只會佔用一個字節,而如果字段的類型爲nvarchar,則會佔用兩個字節.
  正常情況下,我們使用varchar也可以存儲中文字符,但是如果遇到操作系統是英文操作系統並且對中文字體的支持不全面時, 在SQL Server存儲中文字符爲varchar就會出現亂碼(顯示爲??).而且正常情況下,主機都會支持中文的環境,所以如果使用varchar來存儲數據,在開發階段是發現不了的.多數情況下,在佈署的時候也不會有問題.
  但是!如果佈署的主機是英文操作系統,並且不支持中文環境,那問題就出來了.所有的varchar字段在存儲中文的時候都會變成亂碼(顯示爲??).而且一般情況下你不會知道這是因爲你採用了錯誤的數據類型來存儲所造成的,你會試着去裝中文字體,試着去設置操作系統的語言環境...這些都不能解決問題,唯一能解決問題的是把數據庫字段的類型個性爲nvarchar(或者nchar).對項目管理比較熟悉的朋友應該都知道,到佈署階段再來修改數據庫是一個很恐怖的事情.
  使用nvarchar的另一個非常好處就是在判斷字符串的時候可以不需要考慮中英文兩種字符的差別.
  當然,使用nvarchar存儲英文字符會增大一倍的存儲空間.但是在存儲代價已經很低廉的情況下,優先考慮兼容性會給你帶來更多好處的.
  所以在Design的時候應該儘量使用nvarchar來存儲數據.只有在你確保該字段不會保存中文的時候,才採用varchar來存儲.

如果 varchar(300) 和 varchar(8000) 都存儲相同的字符數,性能上是沒有差別的,存儲行爲上也沒有不同。因爲它們都有相同的存儲結構,兩個字節的偏移,兩個字節的列數(如果表中所有的列都是 varchar 類型)。區別只在於存儲容量上。
大多數的性能比較都集中在 varchar 和 char,varchar 和 varchar(max) 上。還有,行外存儲(SQL Server 2005 支持的)。

  varchar(max) (lob 類型)與 varchar 存儲方式是不同的。
  當 LOB 數據足夠小時,可以考慮將數據直接存儲在數據行(行所在的數據頁面)中,從而可以避免額外的讀取 LOB 頁面,提升訪問 LOB 數據的效率(將 LOB 數據直接存儲在數據頁面的閾值由 text in row 選項設置)。
而當 LOB 數據大於此閾值,或者所在行的大小超過了 8060 字節(單行最大 SIZE),LOB 數據將會存儲在 LOB 頁面,而在數據頁面中保留一個指向 LOB 頁面的 16 字節的指針。其訪問效率當然會將低。
另外還有,惡意用戶可以利用這一點“撐爆”你的磁盤。


本文引用內容:http://www.yongfa365.com/Item/SQLServer-varchar-nvarchar.html


發佈了109 篇原創文章 · 獲贊 9 · 訪問量 101萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章