MySQL REGEXP正则匹配查询用法
时间:2026-11-15 07:30 作者:emer 分类: 无
MySQL 的 REGEXP(同义 RLIKE)用于按正则表达式匹配字符串,比 LIKE 通配符强大得多。LIKE 只能写 % 和 _ 做简单前后模糊,遇到「以数字开头」「包含连续三个字母」「手机号段校验」这类条件就力不从心,这时就要用 REGEXP。本文讲清基本语法、常用元字符和实战查询。
一、基本写法
SELECT * FROM users WHERE username REGEXP '^admin';
REGEXP 放在字段和模式之间,匹配成功返回 1。取反用 NOT REGEXP:
SELECT * FROM users WHERE email NOT REGEXP '@';
注意:REGEXP 不区分大小写(取决于校对集),要严格区分可加 BINARY。
二、常用元字符
^匹配开头,$匹配结尾。.任意单个字符。*前项出现 0 次或多次,+出现 1 次以上,?0 或 1 次。[abc]字符集合,[0-9]数字,[a-z]小写字母。{n,m}重复 n 到 m 次。|或,如cat|dog。
三、实战示例
以数字开头的用户名:
SELECT * FROM users WHERE username REGEXP '^[0-9]';
校验手机号(11 位、1 开头):
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';
包含连续两个相同字母:
SELECT * FROM words WHERE name REGEXP '([a-z])\\1';
匹配邮箱大致格式:
SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-z]{2,}$';
四、REGEXP 与 LIKE 怎么选
-- LIKE:只支持 % 与 _
SELECT * FROM goods WHERE title LIKE '%手机%';
-- REGEXP:规则化匹配
SELECT * FROM goods WHERE title REGEXP '手机|平板|电脑';
简单包含用 LIKE 更省资源;需要边界、字符类、重复次数时用 REGEXP。
五、常见坑
- REGEXP 走不到普通索引,大表全表扫描会很慢,只适合小表或后台筛选。
- 反斜杠在 SQL 字符串里要写两个
\\,否则被 MySQL 先解析一层。 - 忘记写
^和$,变成只要包含即可,结果范围过大。 - 中文匹配受字符集影响,
[一-龥]类写法在 utf8mb4 下不一定可靠。 - 把正则当强校验,前端/后端仍需独立校验,数据库正则只是粗筛。
- 大小写敏感需求忘了加
BINARY。
总结
REGEXP 适合规则化的字符串筛选:^、$ 定边界,[] 定字符集,{n,m} 定重复次数,竖线表或。它不走索引,别在大表高频查询里硬用;简单模糊仍优先 LIKE。
遇到问题加QQ23979811 协助处理