LENGTH返回字节数,CHAR_LENGTH返回字符个数;处理中文、emoji等utf8mb4字符串时,前者因编码差异导致数值偏大(如汉字3或4字节),后者恒为1,业务校验必须用CHAR_LENGTH,仅底层字节操作才用LENGTH。
MySQL 里 LENGTH 返回的是字节长度,CHAR_LENGTH 返回的是字符个数——这对中文、emoji 或 utf8mb4 编码的字符串影响极大。比如一个中文汉字在 utf8mb4 下占 3 或 4 字节,LENGTH 会返回 3 或 4,而 CHAR_LENGTH 始终返回 1。
CHAR_LENGTH,否则中文输 3 个字就可能触发 LENGTH > 10LENGTH
LENGTH 是 4,CHAR_LENGTH 是 1PostgreSQL 只有 LENGTH,但它默认按字符计数(行为等价于 MySQL 的 CHAR_LENGTH);SQL Server 的 LEN 也按字符算,但会自动忽略末尾空格——这点容易误判。
LENGTH('你好') → 2,安全可用LEN('abc ') → 3,要用 DATALENGTH('abc ') 才得 6(字节数),且注意 DATALENGTH 返回的是字节数,不是字符数是的,在大表上对字段套 CHAR_LENGTH(name) > 10 基本无法走索引——MySQL 无法为函数结果建立普通 B+Tree 索引(除非用生成列 + 索引)。
name_length TINYINT UNSIGNED AS (CHAR_LENGTH(name)) STORED 生成列,再给它建索引name_len 字段,查询直接用 name_len > 10
CHAR_LENGTH(NULL) 返回 NULL,不是 0;对 TEXT 类型字段调用 CHAR_LENGTH 没问题,但某些老版本 MySQL 对超长 TEXT(如 > 65535 字节)可能截断计算结果。
CHAR_LENGTH(col) IS NULL OR CHAR_LENGTH(col) = 0,不能只写 = 0
MEDIUMTEXT 或 LONGTEXT,建议在应用层校验长度,避免数据库隐式转换开销COALESCE(CHAR_LENGTH(col), 0) 统一转成数字,方便后续比较