天天看點

資料庫中char, varchar, nvarchar的差異

1. char

     固定長度,最長n個字元。

2. varchar

     最大長度為n的可變字元串。

(n為某一整數,不同資料庫,最大長度n不同)

char和varchar差別:

     varchar必char節省空間,但在效率上比char稍微差一些。

     說varchar比char節省空間,是因為varchar是可變字元串,比如:用varchar(5)存儲字元串“abc”,隻占用3個位元組的存儲空間,而用char(5)存儲,則占用5個位元組(“abc  ”)。

     說varchar比char效率稍差,是因為,當修改varchar資料時,可能因為資料長度不同,導緻資料遷移(即:多餘I/O)。其中,oracle對此多餘I/O描述的表達是:“行遷移”(Row Migration)。

“行遷移”(Row Migration):

      “當一行的記錄初始插入時是可以存儲在一個block中的,由于更新操作導緻行增加了,而block的自由空間已經完全滿了,這個時候就産生了行遷移。在這種情況下,oracle将會把整行資料遷移到一個新的block中,oracle會保留被遷移的行的原始指針指向新的存放行資料的block,這就意味着被遷移行的ROW ID是不會改變的。"

     其中要解釋一下:block是oracle中最小的資料組織與管理機關,是資料檔案磁盤儲存空間機關,也是資料庫I/O最小機關(也就是說,讀和寫都是一個block打大小,是以如果block沒滿時,更新内容長度變更的varchar字段,和更新内容長度沒變的varchar字段,I/O次數是一樣,不存在額外消耗,隻有在block滿時,才會出現額外I/O,是以char和varchar性能之間的性能差異,是相當細微的,絕大多數情況下可以忽略不計,是以上文描述的“稍”差的含義)。

     是以,我的開發經驗是:“用varchar完全代替char吧,沒什麼好顧慮的”。

3. nvarchar

     nvarchar的特性,需要和varchar對比。

     nvarchar和varchar的不同主要是在對于資料的存儲方式上:

     1). varchar:按位元組存儲資料

          varchar(6),最多能存儲6個位元組的資料,比如:“哈哈哈”,“abcdef”......

備注:一個中文字元在資料庫裡占多少個位元組,要看unicode的編碼方式,比如:utf8在mysql上占3個位元組,sqlserver的Chinese_PRC_CI_AS占2個位元組...

     2). nvarchar:按字元存儲資料

          nvarchar(6),最多能存儲6個字元/中文資料,比如:"哈哈哈哈哈哈",“abcdef”......

          nvarchar(m)最大存儲的實際位元組長度=n*m(n跟據編碼方式而定),如果nvarchar存儲的是英文字元,也是根據編碼方式存儲n的位元組長度。也就是說,如果用nvarchar存儲英文字元,會浪費一半以上的存儲空間....

總結:

     1. char和varchar的性能差距是很小的,可以考慮忽略不計。

     2. 在大資料量應用中,使用char和nvarchar有可能導緻大量的存儲空間的浪費。

參考文章:

本文轉自hyddd部落格園部落格,原文連結:http://www.cnblogs.com/hyddd/archive/2012/03/05/2380702.html,如需轉載請自行聯系原作者。