MySQL 8.0+ 支持ICU正则引擎,具备d、s、(?i)等扩展语法;5.7及之前仅支持POSIX BRE,需转义+?{}等,且不支持分组捕获、断言等高级特性,正则匹配无法使用索引。

MySQL 支持正则表达式匹配,但功能比 PCRE 或 JavaScript 的 RegExp 简单得多,尤其在旧版本(如 5.7 及之前)中仅支持基本正则(BRE),不支持分组捕获、反向引用、lookahead 等高级特性。从 MySQL 8.0 开始,引入了 ICU 正则引擎,支持更丰富的语法(如 Unicode 属性、命名捕获、、d、s 等),但仍不支持所有高级正则功能(例如不支持 K、条件匹配、递归模式等)。
确认 MySQL 版本与正则引擎支持
执行以下命令查看当前版本和正则能力:
SELECT VERSION();
MySQL 8.0+ 默认启用 ICU 引擎;若为 5.7 或更低版本,则只能使用 REGEXP(或 RLIKE)的 POSIX BRE 模式,不支持 d、w、+(需转义为 +)、?、{n,m} 等 —— 这些在 5.7 中默认无效(除非启用了 mysql_regexp 插件且配置正确,但极少见)。
- MySQL 8.0+:支持
d、s、、+、?、*、{2,5}、(?:...)、(?i)等常见扩展语法 - MySQL 5.7:仅支持
^、$、.、[...]、[^...]、*(表示前一字符零次或多次)、{n,m}(需双反斜杠)、+、?(均需转义)
常用 Regex 匹配写法(MySQL 8.0+)
利用 REGEXP 或 NOT REGEXP 进行条件过滤:
- 匹配邮箱格式(简化版):
email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$' - 匹配中文字符(需字段为 utf8mb4):
name REGEXP '[\u4e00-\u9fa5]'(注意:MySQL 中 Unicode 范围需用双反斜杠,且 ICU 支持p{Han}更可靠) - 匹配含数字+字母+特殊符号的密码(至少各一个):
pwd REGEXP '[0-9]' AND pwd REGEXP '[a-zA-Z]' AND pwd REGEXP '[!@#$%^&*()]'(MySQL 不支持单条正则内多条件断言,需拆开) - 不区分大小写匹配:
title REGEXP '(?i)mysql tutorial'或使用COLLATE utf8mb4_0900_as_cs配合普通正则
无法实现的“复杂匹配”及替代方案
以下常见需求在 MySQL 原生正则中不支持,需换思路:
-
提取子串(如捕获括号内容):MySQL
REGEXP_SUBSTR()(8.0+)可提取第一个匹配,但不支持指定捕获组编号(如REGEXP_SUBSTR(str, '(\d+)', 1, 1, '', 1)表示取第 1 个捕获组)—— 注意:该函数第 6 参数是match_type,第 5 是match_parameter,第 6 才是subexpr(捕获组索引,从 1 开始) -
替换匹配内容:用
REGEXP_REPLACE()(8.0+),例如:REGEXP_REPLACE(phone, '^(\d{3})(\d{4})(\d{4})$', '+86-$1-$2-$3') -
验证密码强度(必须含大写+小写+数字+符号):不能用单个正则完成(无 lookaround),必须多个
REGEXP条件组合,或交由应用层处理 -
匹配嵌套结构(如括号配对、JSON 层级):正则本身不适合,应避免;改用 JSON 函数(如
JSON_EXTRACT)或程序解析
性能与注意事项
正则匹配无法使用索引(全表扫描),大数据量下慎用。优化建议:
- 先用前缀/范围等索引条件缩小结果集,再加
REGEXP - 避免在
WHERE中对大字段(如 TEXT)频繁正则扫描 - 测试时用
EXPLAIN确认是否走索引;正则永远触发Type: ALL(全表扫描) - 正则表达式越具体越好(如用
^[a-z]{3,10}$比^[a-z]*$更高效)


















