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 编码,存储大小仍为 2 倍 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) 的列中,数据库引擎可以存储使用一个双字节(Unicode 范围 0-65,535)的 10 个字符,但在使用两个双字节(Unicode 范围 65,536-1,114,111)时,存储的字符将少于 10 个。 有关 Unicode 存储和字符范围的详细信息,请参阅 UTF-8 与 UTF-16 之间的存储差异

如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。 如果没有使用 CAST 函数指定 n,则默认长度为 30。

若使用 nchar 或 nvarchar,则建议:

  • 如果列数据项的大小一致,则使用 nchar
  • 如果列数据项的大小差异相当大,则使用 nvarchar
  • 如果列数据项大小相差很大,而且字符串长度可能超过 4,000 双字节,请使用 nvarchar(max)

sysname 是系统提供的用户定义数据类型,除了不可为空外,在功能上与 nvarchar(128) 相同。 sysname 用于引用数据库对象名

为使用 nchar 或 nvarchar 的对象分配的是默认数据库排序规则,但可使用 COLLATE 子句分配特定排序规则。

对于 nchar 和 nvarchar,SET ANSI_PADDING 始终为 ONSET 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 字符串数据类型的最大长度(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。 有关在数据类型之间进行转换的详细信息,请参阅 CAST 和 CONVERT