REGEXP 在 MySQL 中适用于结构化校验而非模糊搜索,性能差于 LIKE,需谨慎使用;REGEXP 与 RLIKE 完全等价,推荐统一用 REGEXP;注意 POSIX ERE 限制、元字符转义、NULL 行为及大小写默认不敏感。

REGEXP 在 MySQL 中不是万能模糊搜索工具,它适合明确模式的校验和筛选,但性能比 LIKE 差、写错容易无声失败——用前必须确认是否真需要正则逻辑。
REGEXP 和 RLIKE 的区别与选择
两者完全等价:REGEXP 和 RLIKE 是同义词,MySQL 解析器视作同一操作符。选哪个纯看团队习惯或可读性偏好,没有功能差异。不推荐混用,尤其在复杂查询中统一用 REGEXP 更易维护。
注意:NOT REGEXP 是标准否定写法;REGEXP NOT 语法错误,会报 ERROR 1064。
- 正确:
WHERE email NOT REGEXP '@gmail\.com$' - 错误:
WHERE email REGEXP NOT '@gmail\.com$'
常见元字符的实际含义和坑点
MySQL 的正则引擎基于 POSIX ERE(扩展正则),不支持 PCRE 特性(如 d、s、lookahead)。很多看似通用的写法会失效:
-
.匹配任意单字符(包括空格),但不匹配换行符(MySQL 字段通常不含换行,这点影响小) -
[^a-z]表示“非小写字母”,但会匹配数字、标点、汉字、空格——如果本意是“只允许字母”,该写法反而放行太多 -
*和+必须跟在某个字符或分组后,ab*合法,*abc直接报错ERROR 1139 - 要匹配字面量
.、$、^等元字符,必须双反斜杠转义:@leetcode\.com$,单反斜杠@leetcode.com$在某些 MySQL 版本里可能被忽略
WHERE 中使用 REGEXP 的典型场景与写法
真正适合 REGEXP 的场景是「结构化校验」,比如邮箱、手机号、编码格式;而不是“模糊搜关键词”。滥用会导致全表扫描和慢查询。
- 查以字母开头且只含字母数字下划线:
WHERE username REGEXP '^[A-Za-z][A-Za-z0-9_]*$' - 查包含至少一个中文字符(需 utf8mb4 排序规则):
WHERE name REGEXP '[u4e00-u9fa5]'(注意:MySQL 8.0+ 才原生支持 Unicode 范围,旧版需用十六进制或函数替代) - 查电话字段含 11 位连续数字(不保证是手机号,但过滤掉明显无效值):
WHERE phone REGEXP '[0-9]{11}' - 查邮箱域名是
qq.com或163.com:WHERE email REGEXP '@(qq|163)\.com$'
别写 WHERE content REGEXP 'error|warning|fail' 替代 LIKE ——性能差且无法利用索引,这种应交给应用层或全文索引。
大小写和 NULL 值的隐式行为
REGEXP 默认不区分大小写,这和多数人直觉一致,但容易在数据校验时漏判。例如 'ABC' REGEXP '^abc$' 返回 1,而你可能期望它失败。
需要严格区分时,加 BINARY 关键字:WHERE name REGEXP BINARY '^Abc$'。注意 BINARY 修饰的是整个表达式,不是只作用于右侧模式。
另外:NULL 值参与 REGEXP 比较时,结果恒为 NULL,即该行不会出现在结果集中(因为 WHERE 条件为 NULL 视为 false)。若需包含 NULL,必须显式判断:WHERE (email REGEXP '@test\.com$') OR email IS NULL。
最常被忽略的是:正则模式本身为 NULL(比如拼接变量出错),整个表达式直接返回 NULL,查不到任何数据也不报错——建议上线前用固定字符串测试模式有效性。


















