应使用length(name) != char_length(name)判断字段是否含中文,因中文在utf8mb4中占3-4字节而英文占1字节,该方法兼容所有版本且性能优于正则;regexp需mysql 8.0+才支持p{han},低版本用十六进制x{4e00}-x{9fff},like不支持unicode范围匹配。

用 REGEXP 或 LIKE 判断字段是否含中文(MySQL)
MySQL 没有内置的「中文字符」判断函数,但中文 Unicode 范围集中在 u4e00-u9fff(基本汉字区),实际可用正则匹配。注意:MySQL 8.0+ 默认支持 REGEXP 的 Unicode 属性(如 \p{Han}),但低版本只能靠范围匹配。
推荐写法(兼容 5.7+):
SELECT * FROM users WHERE name REGEXP '[\u4e00-\u9fff]';
如果报错「Invalid regexp」,说明 MySQL 版本不支持 Unicode 转义(常见于 5.7 以下),改用十六进制表示:
SELECT * FROM users WHERE name REGEXP '[x{4e00}-x{9fff}]';
但更稳妥、广泛兼容的方式是用 LIKE 配合多个区间(虽略啰嗦,但无依赖):
SELECT * FROM users WHERE name LIKE '%[u4e00-u9fff]%' ESCAPE '';
⚠️ 实际上 LIKE 不支持 Unicode 范围,所以上面写法无效——这是新手常踩的坑。正确做法是:放弃 LIKE,改用 REGEXP + 十六进制,或升级到 MySQL 8.0+ 后使用 REGEXP '\p{Han}'。
CHAR_LENGTH() 和 LENGTH() 差值判断(通用方案)
中文字符在 UTF8mb4 编码下占 3 或 4 字节,而英文/数字占 1 字节。因此对同一字符串:LENGTH(str) > CHAR_LENGTH(str) 基本可断定含多字节字符(包括中文、日文、emoji 等)。
- 适用于所有支持这两个函数的数据库(MySQL、PostgreSQL、SQL Server)
- 不是 100% 精确:可能误判 emoji 或全角标点,但对「找中文」足够实用
- 性能尚可,比正则快,尤其在没索引时
示例(MySQL):
SELECT * FROM users WHERE LENGTH(name) != CHAR_LENGTH(name);
若只要中文、排除 emoji,可叠加条件:LENGTH(name) > CHAR_LENGTH(name) AND name NOT REGEXP '[ð-÷]'(过滤四字节 utf8 字符)。
PostgreSQL 怎么查含中文字段?用 ~ 和 Unicode 类
PostgreSQL 正则能力更强,默认支持 Unicode 属性类,直接写最干净:
SELECT * FROM users WHERE name ~ '\p{Han}';
如果提示「invalid character class」,检查是否启用了 ICU 支持(9.6+ 默认启用;旧版需编译时加 --with-icu)。不依赖 ICU 的降级写法:
SELECT * FROM users WHERE name ~ '[u4e00-u9fff]';
注意 PostgreSQL 的 ~ 是区分大小写的正则操作符;若字段可能含大小写混合的非中文干扰项,建议加 COLLATE "C" 避免排序规则影响匹配。
SQL Server 中用 LIKE 配合 Unicode 字符集判断
SQL Server 的 LIKE 支持 Unicode 字符范围(前提是字段为 NVARCHAR 类型,且查询用 N'...' 前缀):
SELECT * FROM users WHERE name LIKE N'%[一-龥]%';
其中 一(U+4E00)到 龥(U+9FFF)覆盖常用汉字。这个写法简洁、高效,且无需正则引擎。
- 必须用
N'...',否则会当作单字节字符串处理,范围失效 - 字段类型要是
NVARCHAR,VARCHAR存中文可能已乱码,查不到结果 - 不能写成
LIKE '%[u4e00-u9fff]%'—— SQL Server 不识别 u 转义
如果要覆盖生僻字或扩展区(如 U+3400–U+4DBF),可叠加:name LIKE N'%[一-龥]%' OR name LIKE N'%[u3400-u4dbf]%',但需确认 SQL Server 版本是否支持该语法(2012+ 安全)。
真正容易被忽略的是字符集和排序规则:哪怕写了正确的范围,如果数据库或字段用的是 SQL_Latin1_General_CP1_CI_AS 这类非 Unicode 排序规则,LIKE 可能完全不按 Unicode 行为匹配。查之前先确认:SELECT COLLATION_NAME FROM sys.columns WHERE object_id = OBJECT_ID('users') AND name = 'name';










