mysql中应优先用char_length()判断字符个数,因它返回真实字符数(如“你好”为2),而length()返回字节数(utf8mb4下为6);where条件中应写char_length(column_name) > n。

MySQL 用 CHAR_LENGTH() 而不是 LENGTH()
中文、emoji 或 utf8mb4 字符在 MySQL 中,LENGTH() 返回的是字节数,CHAR_LENGTH() 才是真实字符个数。比如字段存了 "你好",LENGTH() 可能返回 6(utf8mb4 下每个汉字占 3 字节),但 CHAR_LENGTH() 稳定返回 2。
实操建议:
- 永远优先用
CHAR_LENGTH(column_name) > N判断字符长度 - 如果表字符集是
latin1且只存英文,两者结果一致,但不推荐依赖这种巧合 - 在 WHERE 子句中直接使用,例如:
SELECT * FROM users WHERE CHAR_LENGTH(name) > 10;
PostgreSQL 必须用 LENGTH()
PostgreSQL 的 LENGTH() 函数就是按字符计数的,没有 CHAR_LENGTH() 这个别名(虽然部分版本兼容,但非标准)。它对 Unicode 完全友好,"??"、"你好" 都算作 1 个字符。
实操建议:
- 直接写
LENGTH(column_name) > N - 注意:不能用
CHAR_LENGTH()—— 在较老版本 PostgreSQL(如 9.6)里会报错function char_length(unknown) does not exist - 示例:
SELECT * FROM products WHERE LENGTH(description) > 200;
SQL Server 用 LEN(),但要小心尾部空格
LEN() 会自动忽略字符串末尾的空格,所以 LEN('abc ') 返回 3,不是 6。如果你的业务逻辑要求把空格算进长度(比如校验输入是否填满固定宽度字段),这就成了坑。
实操建议:
- 需要包含尾部空格时,改用
DATALENGTH(column_name) / DATALENGTH('x')粗略换算(假设单字节字符),或更稳妥地用LEN(RTRIM(column_name) + 'x') - 1来“骗过”截断逻辑 - 日常多数场景用
LEN(column_name) > N即可 - 示例(常规用法):
SELECT * FROM orders WHERE LEN(order_no) > 12;
通用写法?没有,但可以提前确认数据库类型和字段定义
跨数据库移植 SQL 时,光靠函数名对齐没用——语义可能不同。真正省事的做法,是在写条件前先查清楚三件事:SELECT column_name, data_type, character_maximum_length FROM information_schema.columns;确认字符集;再决定用哪个函数。
容易被忽略的一点:TEXT / CLOB 类型字段在某些旧版 SQL Server 或 Oracle 中,LEN() 或 LENGTH() 可能不支持或截断计算,这时得转成 CAST(column AS VARCHAR(8000)) 再算——但要注意截断风险。











