如何用SQL的LENGTH和CHAR_LENGTH函数区分并获取字符串字节长度的不同之处?
- 内容介绍
- 文章标签
- 相关推荐
本文共计895个文字,预计阅读时间需要4分钟。
在MySQL中,`LENGTH()` 和 `CHAR_LENGTH()` 都可以用来计算字符串长度,但它们的意义有所不同。`LENGTH()` 返回的是字符串的物理字节长度,而 `CHAR_LENGTH()` 返回的是字符的个数。
如果你关心的是这个字段实际占多少存储空间或是否超出VARBINARY限制,你应该使用 `LENGTH()`,因为它的值包括了所有字符的编码字节。
如果你只关心有几个汉字/字母,应该使用 `CHAR_LENGTH()`,因为它不考虑字符编码的长度差异。
简而言之:
根本原因在于 MySQL 的字符集处理方式:UTF8MB4 下,一个汉字占 3 或 4 字节,而 LENGTH() 按字节计数,CHAR_LENGTH() 按 Unicode 字符计数(无论多长)。
中文、emoji 场景下 LENGTH 明显大于 CHAR_LENGTH
执行这条语句就能直观看到差异:
SELECT '你好?' AS str, LENGTH('你好?') AS byte_len, CHAR_LENGTH('你好?') AS char_len;
结果通常是:byte_len = 10(“你好”各 3 字节 + ? 占 4 字节),char_len = 3(两个汉字 + 一个 emoji 算一个字符)。
本文共计895个文字,预计阅读时间需要4分钟。
在MySQL中,`LENGTH()` 和 `CHAR_LENGTH()` 都可以用来计算字符串长度,但它们的意义有所不同。`LENGTH()` 返回的是字符串的物理字节长度,而 `CHAR_LENGTH()` 返回的是字符的个数。
如果你关心的是这个字段实际占多少存储空间或是否超出VARBINARY限制,你应该使用 `LENGTH()`,因为它的值包括了所有字符的编码字节。
如果你只关心有几个汉字/字母,应该使用 `CHAR_LENGTH()`,因为它不考虑字符编码的长度差异。
简而言之:
根本原因在于 MySQL 的字符集处理方式:UTF8MB4 下,一个汉字占 3 或 4 字节,而 LENGTH() 按字节计数,CHAR_LENGTH() 按 Unicode 字符计数(无论多长)。
中文、emoji 场景下 LENGTH 明显大于 CHAR_LENGTH
执行这条语句就能直观看到差异:
SELECT '你好?' AS str, LENGTH('你好?') AS byte_len, CHAR_LENGTH('你好?') AS char_len;
结果通常是:byte_len = 10(“你好”各 3 字节 + ? 占 4 字节),char_len = 3(两个汉字 + 一个 emoji 算一个字符)。

