nchar 和 nvarchar (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics 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 charnational 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 varyingnational character varying

備註

常見的誤解是以為 nchar(n)nvarchar(n) 中的 n 會定義字元數目。 不過,在 nchar(n)nvarchar(n) 中,n 會以位元組配對為單位來定義字串長度 (0-4,000)。 n 一律不會定義可儲存的字元數。 這類似於 char(n)varchar(n) 的定義。

發生誤解的原因是,在使用 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。

如果使用 ncharnvarchar,建議您:

  • 當資料行資料項目的大小一致時,請使用 nchar
  • 當資料行資料項目的大小變化相當大時,請使用 nvarchar
  • 當資料行資料項目的大小變化相當大,且字串長度可能超出 4,000 位元組配對時,請使用 nvarchar(max)

sysname 是系統提供的使用者定義資料類型,功能相當於 nvarchar(128),但不可為 Null。 sysname 可用於參考資料庫物件名稱。

除非使用 COLLATE 子句指派特定定序;否則使用 ncharnvarchar 的物件會獲指派資料庫的預設定序。

SET ANSI_PADDING 針對 ncharnvarchar 一律為 ONSET ANSI_PADDING OFF 不適用於 ncharnvarchar 資料類型。

在 Unicode 字元字串常數前面加上字母 N 以表示 UCS-2 或 UTF-16 輸入,視是否使用 SC 定序而定。 若沒有 N 前置詞,字串會被轉換為資料庫的預設字碼頁,這可能無法識別特定字元。 從 SQL Server 2019 (15.x) 開始,當使用支援 UTF-8 的定序時,預設字碼頁能夠儲存 UNICODE UTF-8 字元集。

在字串常數前面加上字母 N 時,若要轉換的常數未超過 nvarchar 字串資料類型的最大長度 (4,000),則隱含轉換的結果便會是 UCS-2 或 UTF-16 字串。 否則,隱含轉換的結果便會是大型值 nvarchar(max)

警告

每個非 Null 的 varchar(max)nvarchar(max) 資料行都需要額外 24 個位元組的固定配置,而不利於排序作業期間 8,060 個位元組的資料列限制。 這些額外的位元組可能會對資料表中的非 null varchar(max)nvarchar(max) 資料行數目產生隱含限制。 建立資料表時 (高於最大資料列大小超過允許上限 8,060 位元組所引發的一般警告) 或插入資料時,不會提供任何特殊錯誤。 如此大型的資料列可能會在某些一般作業期間發生使用者非預期的錯誤 (例如錯誤 512)。 這些作業的其中兩個範例是叢集索引鍵更新或多種完整資料行集。

轉換字元資料

如需轉換字元資料的資訊,請參閱 char 和 varchar (Transact-SQL)

另請參閱