nchar 和 nvarchar (Transact-SQL)
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
固定大小 nchar 或變動大小 nvarchar 的字元資料類型。 在 SQL Server 2012 (11.x) 和更新版本中,使用補充字元 (SC) 的定序時,這些數據類型會儲存 Unicode 字元數據的完整範圍,並使用 UTF-16 字元編碼。 若指定非 SC 定序,則這些資料類型只會存放 UCS-2 字元編碼所支援之字元資料的子集。
引數
nchar [ ( n ) ]
固定大小字串資料。 n 會定義字串大小 (以位元組配對為單位),必須是 1 到 4,000 的值。 儲存體大小是 n 個位元組的兩倍。 針對 UCS-2 編碼,儲存大小是 n 位元組的兩倍,而可存放的字元數目也是 n。 若為UTF-16編碼,儲存大小仍為 n 位元組的兩倍,但可以儲存的字元數目可能小於 n,因為增補字元會使用兩個字節組(也稱為代理字組)。 nchar 的 ISO 同義字為 national char 及 national character。
nvarchar [ ( n | max ) ]
可變大小字串資料。 n 的值會以位元組定義字串大小,而且可以從 1 到 4,000。 max 表示儲存體大小上限是 2^31-1 個字元 (2 GB)。 儲存大小是 n 位元組的兩倍 + 2 位元組。 針對 UCS-2 編碼,儲存大小是 n 位元組的兩倍 + 2 位元組,而可存放的字元數目也是 n。 針對UTF-16編碼,記憶體大小仍然是 n 個字節 + 2 個字節的兩倍。 不過,可以儲存的字元數目可能小於 n,因為增補字元使用兩個字節組(也稱為 代理字組)。 nvarchar 的 ISO 同義字為 national char varying 及 national character varying。
備註
常見的誤解是以為 nchar(n) 和 nvarchar(n) 中的 n 會定義字元數目。 不過,在 nchar(n) 和 nvarchar(n) 中,n 會以位元組配對為單位來定義字串長度 (0-4,000)。 n 一律不會定義可儲存的字元數。 這個概念類似於 char 和 varchar 的定義。
發生誤解的原因是,在使用 Unicode 範圍 0 到 65,535 中所定義的字元時,每個位元組配對可以儲存一個字元。 不過,在較高的 Unicode 範圍(65,536 到 1,114,111)中,一個字元可能會使用兩個字節組。 例如,在定義為 nchar(10) 的資料行中,資料庫引擎可以儲存 10 個字元,這些字元會使用一個位元組配對 (Unicode 範圍 0 到 65,535),但使用兩個位元組配對 (Unicode 範圍 65,536 到 1,114,111) 時,則會少於 10 個字元。 如需 Unicode 儲存和字元範圍的詳細資訊,請參閱 UTF-8 和 UTF-16 之間的儲存差異。
當資料定義或變數宣告陳述式中未指定 n 時,預設長度為 1。 當 n 不是由 CAST 函式指定時,預設長度為 30。
如果使用 nchar 或 nvarchar,建議您:
- 當資料行資料項目的大小一致時,請使用 nchar。
- 當資料行資料項目的大小變化相當大時,請使用 nvarchar。
- 當資料行資料項目的大小變化相當大,且字串長度可能超出 4,000 位元組配對時,請使用 nvarchar(max)。
sysname 是系統提供的使用者定義資料類型,功能相當於 nvarchar(128),但不可為 Null。 sysname 可用於參考資料庫物件名稱。
除非使用 COLLATE
子句指派特定定序;否則使用 nchar 或 nvarchar 的物件會獲指派資料庫的預設定序。
SET ANSI_PADDING
針對 nchar 和 nvarchar 一律為 ON
。 SET ANSI_PADDING OFF
不適用於 nchar 或 nvarchar 資料類型。
在 Unicode 字元字串常數前面加上字母 N
以表示 UCS-2 或 UTF-16 輸入,視是否使用 SC 定序而定。 如果沒有前置 N
詞,字串會轉換成資料庫的默認代碼頁,而資料庫可能無法辨識特定字元。 在 SQL Server 2019 (15.x) 和更新版本中,使用啟用 UTF-8 的定序時,默認代碼頁能夠儲存 Unicode UTF-8 字元集。
當您在字串常數前面加上字母 N
時,如果要轉換的 常數未超過 nvarchar 字串數據類型的最大長度,則隱含轉換會產生 UCS-2 或 UTF-16 字元串。 否則,隱含轉換會產生大型值 nvarchar(max)。
警告
每個非 Null 的 varchar(max) 或 nvarchar(max) 資料行都需要額外 24 個位元組的固定配置,而不利於排序作業期間 8,060 個位元組的資料列限制。 這些額外的位元組可能會對資料表中的非 null varchar(max) 或 nvarchar(max) 資料行數目產生隱含限制。 建立資料表時 (高於最大資料列大小超過允許上限 8,060 位元組所引發的一般警告) 或插入資料時,不會提供任何特殊錯誤。 這個大型的數據列大小可能會造成使用者在某些正常作業期間可能未預期的錯誤(例如錯誤 512)。 這些作業的其中兩個範例是叢集索引鍵更新或多種完整資料行集。
轉換字元資料
如需轉換字元數據的相關信息,請參閱 char 和 varchar。 如需在數據類型之間轉換的詳細資訊,請參閱 CAST 和 CONVERT。