在MySQL的字符串处理场景中,LENGTH和CHAR_LENGTH是两个用于计算字符串长度的核心函数,二者的核心差异和字符集的设置直接相关,理解这种差异能避免很多长度计算的错误。

LENGTH与CHAR_LENGTH函数的基础定义
两个函数的官方定义如下:
- LENGTH(str):返回字符串
str的字节长度,计算结果是字符串在存储时占用的字节数。 - CHAR_LENGTH(str):返回字符串
str的字符长度,计算结果是字符串包含的字符个数,和字符的存储字节数无关。
不同字符集下的计算差异演示
MySQL中常见的字符集包括utf8mb4、utf8、gbk等,不同字符集下单个字符占用的字节数不同,会直接影响LENGTH函数的计算结果。
1. 单字节字符集场景
当使用latin1这类单字节字符集时,每个字符占用1个字节,此时两个函数的计算结果一致。
执行以下SQL语句:
-- 设置当前会话字符集为latin1
SET NAMES latin1;
-- 计算英文字符串的长度
SELECT
LENGTH('abc') AS byte_length,
CHAR_LENGTH('abc') AS char_length;
执行结果为:
| byte_length | char_length |
|---|---|
| 3 | 3 |
2. 多字节字符集场景
以utf8mb4字符集为例,该字符集下英文字符占用1个字节,中文等常用字符占用3个字节,emoji等特殊字符占用4个字节,此时两个函数的计算结果会出现差异。
执行以下SQL语句:
-- 设置当前会话字符集为utf8mb4
SET NAMES utf8mb4;
-- 计算包含中文和英文的字符串长度
SELECT
LENGTH('测试abc') AS byte_length,
CHAR_LENGTH('测试abc') AS char_length;
执行结果为:
| byte_length | char_length |
|---|---|
| 9 | 5 |
结果说明:字符串包含2个中文字符和3个英文字符,共5个字符,所以CHAR_LENGTH返回5;中文每个占3字节,英文每个占1字节,总字节数为2*3+3*1=9,所以LENGTH返回9。
3. 特殊字符场景
utf8mb4字符集支持emoji字符,这类字符占用4个字节,进一步放大两个函数的差异。
SET NAMES utf8mb4;
-- 计算包含emoji的字符串长度
SELECT
LENGTH('😊a') AS byte_length,
CHAR_LENGTH('😊a') AS char_length;
执行结果为:
| byte_length | char_length |
|---|---|
| 5 | 2 |
结果说明:emoji占用4字节,英文字符a占用1字节,总字节数为5,所以LENGTH返回5;字符串共2个字符,所以CHAR_LENGTH返回2。
实际开发中的选型建议
根据需求选择合适的函数:
- 如果需要统计字符串的字符个数,比如校验用户名、备注的字符数限制,优先使用
CHAR_LENGTH函数,不受字符集和特殊字符的影响。 - 如果需要统计字符串占用的存储空间,或者处理字节级别的逻辑,比如判断字段存储是否超过阈值,使用
LENGTH函数。 - 如果业务需要兼容多种字符集,建议统一使用
utf8mb4字符集,再根据上述规则选择函数,避免字符集切换带来的计算误差。
注意:数据库的字符集、表的字符集、字段的字符集都可能不同,计算长度时以实际字段的字符集为准,可通过SHOW CREATE TABLE 表名语句查看字段的字符集配置。
MySQLLENGTH函数CHAR_LENGTH函数字符集字符串长度计算修改时间:2026-07-16 01:15:22