長度為 n 個字節的固定長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小為 n 個字節。char 在 SQL-92 中的同義詞為 character。
2、varchar[(n)]
長度為 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小為輸入數據的字節的實際長度,而不是 n 個字節。所輸入的數 據字符長度可以為零。varchar 在 SQL-92 中的同義詞為 char varying 或 character varying。
如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果沒有使用 CAST 函數指定 n,則默認長度為 30。
將為使用 char 或 varchar 的對象被指派數據庫的默認排序規則,除非用 COLLATE 子句另外指派了特定的排序規則。該排序規則控制用於存儲字符數據的代碼頁。
支持多語言的站點應考慮使用 Unicode nchar 或 nvarchar 數據類型以盡量減少字符轉換問題。如果使用 char 或 varchar:
如果希望列中的數據值大小接近一致,請使用 char。
如果希望列中的數據值大小顯著不同,請使用 varchar。
如果執行 CREATE TABLE 或 ALTER TABLE 時 SET ANSI_PADDING 為 OFF,則一個定義為 NULL 的 char 列將被作為 varchar 處理。
當排序規則代碼頁使用雙字節字符時,存儲大小仍然為 n 個字節。根據字符串的不同,n 個字節的存儲大小可能小於 n 個字符。
nchar 是固定長度 Unicode 數據的數據類型,nvarchar 是可變長度 Unicode 數據的數據類型,二者均使用 UNICODE UCS-2 字符集。
3、nchar(n)
包含 n 個字符的固定長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。存儲大小為 n 字節的兩倍。nchar 在 SQL-92 中的同義詞為 national char 和 national character。
4、nvarchar(n)
包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。所輸入的數據字符長度可以為零。nvarchar 在 SQL-92 中的同義詞為 national char varying 和 national character varying。
如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果沒有使用 CAST 函數指定 n,則默認長度為 30。
如果希望列中所有數據項的大小接近一致,則使用 nchar。
如果希望列中數據項的大小差異很大,則使用 nvarchar。
使用 nchar 或 nvarchar 的對象被賦予數據庫的默認排序規則,除非使用 COLLATE 子句賦予特定的排序規則。
SET ANSI_PADDING OFF 不適用於 nchar 或 nvarchar。SET ANSI_PADDING ON 永遠適用於 nchar 和 nvarchar。
一. char(varchar)與nchar(nvarchar)
1.長度比較:
使用前者存儲,每個英文字符占用一個字節,中文占用兩個字節,因此前者最大支持8000個英文字符,4000個中文漢字;
后者使用Unicode字符集,目的就是為了解決字符集的不兼容性,英文非英文都占用2個字節,因此不論什么字符都只是最大支持4000個字符
2.功能比較
可以看出使用nchar、nvarchar數據類型時不用擔心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數量上有些損失
除此之外,char與nchar,varchar和nvarchar使用方法相似
二. char(nchar)與varchar(nvarchar)的比較
1.數據存儲開銷。
a. 每個varchar列需要額外的兩個字節,用於反映存儲的數據的長度。
b. 每個可為NULL的char列,需要一些字節(空位圖)來反應數據的為空性。
c. 無論實際數據的長度是多少,char按照定義的長度分配存儲空間,為定長型。
d. varchar是變長字符數據類型,根據實際存儲的數據長度來分配數據存儲空間。
2.NULL值(空值)。
a. char列的NULL值占用存儲空間。
b. varcahr列的NULL值不占用存儲空間。
c. 插入同樣數量的NULL值,varchar列的插入效率明顯高出char列。
3.插入數據
無論插入數據涉及的列是否建立索引,char的效率都明顯低於varchar。
4. 更新數據
如果更新的列上未建立索引,則char的效率低於varchar,差異不大;建立索引的話,效率較高。
5. 修改結構
a. 無論增加或是刪除的列的類型是char還是varchar,操作都能較快的完成,而且效率上沒有什么差異。
b. 對於增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費時間,而修改char列需要花費很長的時間。
6.數據檢索
無論是否通過索引,varchar類型的數據檢索略優於char的掃描。
三. 選擇char還是選擇varchar的建議
1.適宜於char的情況:
a. 列中的各行數據長度基本一致,長度變化不超過50字節;
b. 數據變更頻繁,數據檢索的需求較少。
c. 列的長度不會變化,修改char類型列的寬度的代價比較大。
d. 列中不會出現大量的NULL值。
e. 列上不需要建立過多的索引,過多的索引對char列的數據變更影響較大。
2.適宜於varchar的情況;
a. 列中的各行數據的長度差異比較大。
b. 列中數據的更新非常少,但查詢非常頻繁。
c. 列中經常沒有數據,為NULL值或為空值。