在SQL开发场景中,字符长度计算是常见需求,尤其是涉及中文字符时,常规的LENGTH函数往往会出现统计偏差。这是因为LENGTH函数统计的是字节数,而中文字符在UTF8等编码下通常占多个字节,导致统计结果远大于实际字符个数。CHAR_LENGTH函数则可以直接统计字符个数,不受编码影响,是计算中文字符长度的正确选择。
CHAR_LENGTH函数基本说明
CHAR_LENGTH是SQL标准中定义的字符统计函数,作用是返回字符串中的字符个数,无论字符是中文、英文、数字还是特殊符号,每个字符都按1个计数。它的语法非常简单,几乎所有主流关系型数据库都支持该函数,部分数据库也提供同义的CHARACTER_LENGTH函数,功能完全一致。
基础语法
-- 基础语法,string为要统计的字符串 CHAR_LENGTH(string)
CHAR_LENGTH与LENGTH的差异对比
很多开发者会混淆CHAR_LENGTH和LENGTH的用法,两者的核心差异在于统计维度不同,我们可以通过表格清晰对比两者的区别:
| 函数名 | 统计维度 | 中文字符统计结果(UTF8编码) | 英文字符统计结果 |
|---|---|---|---|
| CHAR_LENGTH | 字符个数 | 1个中文计1 | 1个英文计1 |
| LENGTH | 字节数 | 1个中文计3(UTF8下) | 1个英文计1 |
不同数据库中的使用示例
MySQL中的使用
MySQL原生支持CHAR_LENGTH函数,我们可以直接在查询中使用它统计中文字符串的长度:
-- 统计中文字符串的字符长度
SELECT CHAR_LENGTH('测试中文') AS char_len,
LENGTH('测试中文') AS byte_len;
-- 结果:char_len为4,byte_len为12(UTF8编码下每个中文占3字节)
PostgreSQL中的使用
PostgreSQL同样支持CHAR_LENGTH,也支持同义的CHARACTER_LENGTH,用法和MySQL一致:
-- PostgreSQL中统计中文字符长度
SELECT CHAR_LENGTH('PostgreSQL测试') AS char_len,
CHARACTER_LENGTH('PostgreSQL测试') AS char_len2;
-- 结果:char_len和char_len2都为12,每个字符计1
SQL Server中的使用
SQL Server中对应的函数是LEN,功能和CHAR_LENGTH一致,统计字符个数:
-- SQL Server中统计中文字符长度
SELECT LEN('SQL Server测试') AS char_len,
DATALENGTH('SQL Server测试') AS byte_len;
-- 结果:char_len为11,DATALENGTH返回字节数,UTF8下中文占3字节
实际开发场景应用
在实际业务中,比如用户昵称长度限制、地址字段长度校验等场景,都需要用CHAR_LENGTH来统计中文字符长度,避免因为编码问题导致校验错误。例如校验用户昵称不能超过10个字符,包含中文、英文都可以:
-- 校验用户昵称长度,不超过10个字符 SELECT * FROM user_table WHERE CHAR_LENGTH(nickname) > 10; -- 只要字符个数超过10就会被查询出来,无论包含多少中文
注意事项
- CHAR_LENGTH统计的是可见字符个数,不包含字符串末尾的空字符,如果字符串包含空格,空格也会被计入字符个数。
- 如果传入的参数为NULL,CHAR_LENGTH函数会返回NULL,使用前可以先做空值判断。
- 部分低版本的数据库可能不支持CHAR_LENGTH函数,可查阅对应数据库的官方文档确认兼容性。
总结:需要统计字符个数、尤其是包含中文字符的场景,优先使用CHAR_LENGTH函数,避免使用LENGTH函数导致的字节统计偏差问题。
SQLCHAR_LENGTH中文字符长度字符计数修改时间:2026-06-22 11:51:44