1、前言sql
在瞭解varchar 和nvarchar以前我們先了解一下這些詞的字面和經常使用意思,以方便咱們更好的使用:數據庫
SQL SERVER中生成的語句中,字符串前加N。N 前綴必須是大寫字母。是Unicode編碼的意思,通常來講,英文字符是一個字節組成,可是國際上的字太多了,所以就用兩個字節來表示字符,知足國際化的須要.編碼
在字符串前面加上 N 表明存入數據庫時以 Unicode 格式存儲。N'string' 表示string是個Unicode字符串
Unicode 字符串的格式與普通字符串類似,但它前面有一個 N 標識符(N 表明 SQL-92 標準中的國際語言 (National Language))。N 前綴必須是大寫字母。例如,'Michél' 是字符串常量而 N'Michél' 則是 Unicode 常量。Unicode 常量被解釋爲 Unicode 數據,而且不使用代碼頁進行計算。Unicode 常量確實有排序規則,主要用於控制比較和區分大小寫。爲 Unicode 常量指派當前數據庫的默認排序規則,除非使用 COLLATE 子句爲其指定了排序規則。Unicode 數據中的每一個字符都使用兩個字節進行存儲,而字符數據中的每一個字符則都使用一個字節進行存儲。有關更多信息,請參見使用 Unicode 數據。
Unicode 字符串常量支持加強的排序規則。
select '''a''' --輸出'a' 在sql語句中'用''來轉義,其餘字符能夠直接輸
存儲含有中文字符的最好有nvarchar
存儲只有英文、數字的最好用varchar
二 、 類型前綴的意思
1.有var前綴的,表示是實際存儲空間是變長的,varchar,nvarchar
所謂定長就是長度固定的,當輸入的數據長度沒有達到指定的長度時將自動以英文空格在其後面填充,使長度達到相應的長度;而變長字符數據則不會以空格填充,比較例外的是,text存儲的也是可變長。
2.有n前綴的,n表示Unicode字符,即全部字符都佔兩個字節,nchar,nvarchar 字符中,英文字符只須要一個字節存儲就足夠了,但漢字衆多,須要兩個字節存儲,英文與漢字同時存在時容易形成混亂,Unicode字符集就是爲了解決字符集這種不兼容的問題而產生的,它全部的字符都用兩個字節表示,即英文字符也是用兩個字節表示。
3.基於以上兩點來看看字段容量
char,varchar 最多8000個英文,4000個漢字
nchar,nvarchar 可存儲4000個字符,不管英文仍是漢字
varchar與nvarchar的選擇("n"前綴)
使用varchar存儲含有非英文字符(好比中文,日文)時出現「??」的亂碼
使用nvarchar的一個很是好處就是在判斷字符串的時候能夠不須要考慮中英文兩種字符的差異. 固然,使用nvarchar存儲英文字符會增大一倍的存儲空間.可是在存儲代價已經很低廉的狀況下,優先考慮兼容性會給你帶來更多好處的.
因此在Design的時候應該儘可能使用nvarchar來存儲數據.只有在你確保該字段不會保存中文的時候,才採用varchar來存儲.
2、SqlServer中nvarchar和varchar的區別 以及各自的定義:
1.nvarchar(n) : 包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。所輸入的數據字符長度能夠爲零。
2.varchar[(n)]: 長度爲 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節。所輸入的數據字符長度能夠爲零。
二、區別:
1.從存儲方式上,nvarchar是按字符存儲的,而 varchar是按字節存儲的;
2.從存儲量上考慮, varchar比較節省空間,由於存儲大小爲字節的實際長度,而 nvarchar是雙字節存儲;
3.在使用上,若是存儲內容都是英文字符而沒有漢字等其餘語言符號,建議使用varchar;含有漢字的使用nvarchar,由於nvarchar是使用Unicode編碼,即統一的字符編碼標準,會減小亂碼的出現概率;
4.若是你作的項目可能涉及不一樣語言之間的轉換,建議用nvarchar。