应根据数据库类型选择:SQL Server用LEN(),MySQL/PostgreSQL/Oracle/SQLite用LENGTH();多语言场景推荐CHAR_LENGTH()以准确计字符数,避免字节与字符混淆。
LEN 和 LENGTH 到底该用哪个?不是所有数据库都认 LEN——它只在 SQL Server 和某些旧版 Access 中有效;MySQL、PostgreSQL、SQLite、Oracle 一律用 LENGTH。如果在 MySQL 里写 LEN(name),会直接报错 FUNCTION LEN does not exist。PostgreSQL 还额外支持 CHAR_LENGTH(按字符计数,对多字节 UTF-8 更可靠),而 LENGTH 在 PostgreSQL 里默认按字节计数,这点容易踩坑。
核心就是把长度函数放进 WHERE 子句做比较,但要注意 NULL 处理和边界值逻辑:
WHERE LENGTH(name) > 50 筛出超过 50 字符的记录(name 为 NULL 时整行被跳过,因为 LENGTH(NULL) 返回 NULL,不满足 > 条件)WHERE LENGTH(name) > 50 OR name IS NULL
VARCHAR(10) 但存的是 UTF-8,MySQL 的 LENGTH() 返回字节数(一个汉字通常占 3 字节),此时 LENGTH(name) > 30 才等价于“字符数超 10”,别直接套用字段长度声明CHAR_LENGTH 比 LENGTH 更安全?当字段含 emoji、中文、日文或带变音符号的字母时,LENGTH 在 PostgreSQL 和 MySQL 中返回字节数,而 CHAR_LENGTH 统一返回 Unicode 字符个数。比如字符串 '??'(程序员 emoji)在 PostgreSQL 里:LENGTH 返回 4(UTF-8 编码占 4 字节),CHAR_LENGTH 返回 1。业务校验“最多 10 个字符”必须用 CHAR_LENGTH,否则一条 emoji 就触发误判。
绝大多数情况下会。因为 LENGTH(name) > 20 是函数计算,数据库无法直接走 name 字段上的 B-tree 索引。如果高频查询这类条件,考虑增加生成列并建索引(MySQL 5.7+):
ALTER TABLE users ADD COLUMN name_len TINYINT GENERATED ALWAYS AS (CHAR_LENGTH(name)) STORED;<br>CREATE INDEX idx_name_len ON users(name_len);之后查
WHERE name_len > 20 就能走索引。但注意生成列本身占存储空间,且写入时有微小开销。实际写的时候,先看自己用的是什么数据库,再决定用 LEN 还是 LENGTH 或 CHAR_LENGTH;涉及多语言就得切到 CHAR_LENGTH;真要查得快,别只靠函数过滤,得配合生成列和索引。