本文深入探讨了SQL Server中汉字的存储长度问题,文章指出,汉字占用的空间取决于数据类型和排序规则,在varchar类型下,汉字通常占用2个字节,但LEN()函数计数为1;在nvarchar类型下,汉字占用2个字节(UTF-16编码),LEN()计数也为1,文章详细解析了字符与字节的区别,并分析了不同排序规则对存储的影响,帮助开发者准确理解数据库存储机制。
在 SQL Server 的数据库开发和维护过程中,字符串长度的定义与存储是一个永恒的话题,特别是对于中文环境下的开发者来说,最常遇到的一个困惑就是:在 SQL Server 中,一个汉字究竟占几个字符?
这个问题的答案并非一句话就能概括,它取决于你所使用的数据类型、数据库的排序规则以及 SQL Server 的版本,为了彻底厘清这个问题,我们需要从“字符”和“字节”的区别说起。
核心概念:字符 vs 字节
在探讨具体占用空间之前,必须先区分两个函数:

LEN(字符串):返回的是字符数(Character count),无论汉字还是字母,在这里通常都被视为 1 个字符。DATALENGTH(字符串):返回的是字节数(Byte count),这才是真正决定存储空间大小的指标。
不同数据类型下的汉字存储
SQL Server 中处理字符串主要分为两类数据类型:VARCHAR(非 Unicode)和 NVARCHAR(Unicode)。
使用 NVARCHAR / NCHAR 类型(推荐)
这是处理多语言(包括中文)的标准方式。N 代表 National(Unicode),使用 UCS-2 编码(类似于 UTF-16)。
- 占用情况:无论是一个汉字、一个英文字母,还是一个全角标点,都固定占用 2 个字节。
- 字符计算:
LEN('汉')的结果是 1。 - 字节计算:
DATALENGTH('汉')的结果是 2。
在 NVARCHAR 类型下,一个汉字算作 1 个字符,占用 2 个字节,这意味着如果你定义了 NVARCHAR(10),你既可以存 10 个汉字,也可以存 10 个英文字母。
使用 VARCHAR / CHAR 类型(传统方式)
这种类型的存储大小完全取决于数据库的排序规则。
-
场景 A:使用 Chinese_PRC 系列排序规则(最常见) 这是国内安装 SQL Server 时的默认设置,它使用 GBK 编码。
- 占用情况:一个汉字占用 2 个字节,一个英文字母占用 1 个字节。
- 字符计算:
LEN('汉')的结果是 1。 - 字节计算:
DATALENGTH('汉')的结果是 2。
注意:虽然汉字占 2 字节,字母占 1 字节,但在定义
VARCHAR长度时,单位依然是字节,这意味着VARCHAR(10)最多只能存 5 个汉字(5 * 2 = 10),但能存 10 个字母,这就是为什么很多开发者在用VARCHAR存中文时经常遇到“字符串或二进制数据将被截断”的错误。 -
场景 B:使用 SQL Server 2019+ 的 UTF-8 排序规则 从 SQL Server 2019 开始,引入了对
_UTF8排序规则的支持。- 占用情况:在 UTF-8 编码下,一个汉字通常占用 3 个字节,英文字母占用 1 个字节。
- 字节计算:
DATALENGTH('汉')的结果是 3。
在这种情况下,
VARCHAR(10)甚至存不下 4 个汉字(4 * 3 = 12 > 10)。
实战演示
我们可以运行一段简单的 SQL 代码来直观地查看区别:
-- 假设数据库默认排序规则为 Chinese_PRC_CI_AS
DECLARE @ncharStr NVARCHAR(10) = '汉A';
DECLARE @varcharStr VARCHAR(10) = '汉A';
SELECT
'NVARCHAR' as 类型,
LEN(@ncharStr) as 字符数,
DATALENGTH(@ncharStr) as 字节数
UNION ALL
SELECT
'VARCHAR' as 类型,
LEN(@varcharStr) as 字符数,
DATALENGTH(@varcharStr) as 字节数;
输出结果:
| 类型 | 字符数 | 字节数 |
|---|---|---|
| NVARCHAR | 2 | 4 (每个字符2字节) |
| VARCHAR | 2 | 3 (汉字2字节+字母1字节) |
总结与建议
回到最初的问题:“SQL Server 中一个汉字几个字符?”
- 从逻辑长度看:无论是哪种类型,使用
LEN()函数,一个汉字永远是 1 个字符。 - 从物理存储看:
NVARCHAR:2 字节。VARCHAR(GBK):2 字节。VARCHAR(UTF-8):3 字节。
开发建议:
为了避免乱码风险以及因为中英文混合存储导致的长度截断问题,强烈建议在涉及中文、多语言或不确定输入内容的项目中,统一使用 NVARCHAR 类型。
虽然 NVARCHAR 会比 VARCHAR(在仅存英文时)多占用一倍的磁盘空间,但在现代存储成本下,换来数据的安全性和系统的稳定性是完全值得的,如果你使用 NVARCHAR(10),那么你就可以毫无顾虑地存入 10 个汉字,而不需要去心算 2 倍或 3 倍的字节关系。


