轉自:http://blog.csdn.net/a11112244444/article/details/51475107
首先介紹一下定長或變長
所謂定長就是長度固定的,當輸入的數據長度沒有達到指定的長度時將自動以英文空格在其后面填充,使長度達到相應的長度;有var前綴的,表示是實際存儲空間是變長的,比如varchar,nvarchar變長字符數據則不會以空格填充,比較例外的是,text存儲的也是可變長。
舉例:用varchar(5)存儲字符串“abc”,只占用3個字節的存儲空間,而用char(5)存儲,則占用5個字節(“abc ”)
nvarchar(6),最多能存儲6個字符/中文數據,比如:"哈哈哈哈哈哈",“abcdef”......
再介紹一下Unicode或非Unicode
數據庫中,英文字符只需要一個字節存儲就足夠了,但漢字和其他眾多非英文字符,則需要兩個字節存儲。如果英文與漢字同時存在,由於占用空間數不同,容易造成混亂,導致讀取出來的字符串是亂碼。Unicode字符集就是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。而前綴n就表示Unicode字符,比如nchar,nvarchar,這兩種類型使用了Unicode字符集。
Ps:VARCHAR類型的實際長度是它的值的實際長度+1。為什么"+1"呢?這一個字節用於保存實際使用了多大的長度
總結:
從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數字,用char/varchar。
char和varchar的性能差距是很小的,可以考慮忽略不計。
在大數據量應用中,使用char和nvarchar有可能導致大量的存儲空間的浪費。
(最后一句有誤?)