nchar 和 nvarchar (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics 是并行数据仓库

字符数据类型 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^30-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(n) 和 VARCHAR(n) 的定义。
出现此误解的原因是,使用在 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 是系统提供的用户定义数据类型,除了不可为 Null 外,在功能上与 nvarchar(128) 相同。 sysname 用于引用数据库对象名。

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

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 字符串数据类型的最大长度 (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)

另请参阅

ALTER TABLE (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
COLLATE (Transact-SQL)
CREATE TABLE (Transact-SQL)
数据类型 (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
LIKE (Transact-SQL)
SET ANSI_PADDING (Transact-SQL)
SET @local_variable (Transact-SQL)
排序规则和 Unicode 支持
单字节和多字节字符集