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有可能導致大量的儲存空間的浪費。
參考部落格:http://www.cnblogs.com/hyddd/ 參考文章:《Row Chaining and Row Migration》《SQLSERVER char與varchar的效能測試》