Length() 计算字节数,char_length() 计算字符数。一、length() 返回字符串所占字节数,在 utf8mb4 中一个中文占 3 或 4 字节,如 ‘你好’ 的 length() 为 6;二、char_length() 返回实际字符个数,不受编码影响,如 ‘你好’ 的 char_length() 为 2;三、应用场景:验证用户输入字符数用 char_length(),判断字节限制用 length();四、编码不同结果不同,在 latin1 中两者一致,在 utf8mb4 中则有差异。
在处理中文字符时,LENGTH() 和 CHAR_LENGTH() 看起来都是用来计算字符串长度的函数,但它们之间有一个非常关键的区别:一个看字节,一个看字符。
这个区别在操作中文、日文、韩文等使用多字节编码的语言时尤其重要。
一、LENGTH() 计算的是字节数
mysql 中的 LENGTH() 函数返回的是字符串所占的字节数,而不是字符数。
比如你用的是 utf8mb4 编码(支持中文和表情),一个中文字符通常占用 3 或 4 个字节。所以如果你写:
SELECT LENGTH('你好');
结果是 6(每个“你”和“好”各占 3 字节)。
常见误区:很多人以为字符串长度就是字符个数,但在数据库里,LENGTH() 并不是这么工作的。
二、CHAR_LENGTH() 看的是字符数量
而 CHAR_LENGTH() 返回的是字符串中字符的实际个数,不管它用了多少字节。
还是上面的例子:
SELECT CHAR_LENGTH('你好');
结果是 2,因为“你好”就是两个字符。
这点在做内容限制或截断逻辑的时候特别重要。比如你要判断某个字段是否超过 10 个汉字,用 CHAR_LENGTH() 才靠谱。
三、常见应用场景对比
- ✅ 验证用户输入的中文字符数是否符合要求(如昵称最多 10 个字) → 使用 CHAR_LENGTH()
- ✅ 判断数据是否超出列的字节限制(如 varchar(255) 在 utf8mb4 下只能存 85 个中文) → 使用 LENGTH()
- ❌ 错误地用 LENGTH() 来限制字符数,可能导致误判
举个例子:
-- 想判断是否超过 10 个中文? SELECT * FROM users WHERE CHAR_LENGTH(name) > 10; -- 想检查 name 是否超出了 30 字节? SELECT * FROM users WHERE LENGTH(name) > 30;
四、小细节:编码不同,结果也不同
- 如果你的表用的是 latin1 编码,那每个字符就是一个字节,这时候 LENGTH() 和 CHAR_LENGTH() 结果一样。
- 但如果用了 utf8mb4,像中文、emoji 这类字符就会占用更多字节,两者差距就出来了。
总的来说,需要关心具体有多少个汉字、字母、符号时,用 CHAR_LENGTH();需要考虑存储空间、字节限制时,用 LENGTH()。
基本上就这些,不复杂但容易搞混。