是,REGEXP和RLIKE完全等价,均为MySQL正则匹配操作符,语法、行为、返回值(1/0/NULL)及性能均一致,仅是同义词;8.0+用ICU引擎支持Unicode和\d等,5.7用Henry Spencer库功能较弱且不支持非贪婪量词。

MySQL的REGEXP和RLIKE到底是不是一回事
是,完全等价。MySQL里REGEXP和RLIKE是同一个操作符的两种写法,语法、行为、性能毫无区别。用哪个纯看团队习惯或SQL可读性偏好——比如模糊匹配场景下name RLIKE '^A.*e$'比name REGEXP '^A.*e$'多一个音节,但语义更直白。
注意:MySQL 8.0+默认使用ICU正则引擎,支持Unicode和更多元字符;老版本(5.7及之前)用的是Henry Spencer的正则库,功能较弱,比如不支持\d、\s,得写成[0-9]、[[:space:]]。
哪些字符类和量词在MySQL中真正可用
别直接套用PCRE或JavaScript的正则经验。MySQL(尤其5.7)对字符类支持有限,且不区分贪婪/非贪婪(所有量词都是贪婪的)。
-
[[:digit:]]可用,\d在8.0+才支持,5.7会报错 -
[[:alpha:]]、[[:alnum:]]、[[:space:]]安全通用 -
+、*、?、{n,m}都支持,但??或+?这种非贪婪写法无效 -
^和$是行首/行尾锚点,但MySQL按“整字段值”匹配,所以^abc$只匹配完整等于"abc"的字段,不是子串 - 想匹配子串?去掉
^和$,或改用CONCAT('%', ... , '%')配合LIKE更高效
常见错误:NULL值、大小写、索引失效
REGEXP遇到NULL字段时结果恒为NULL,不是FALSE,容易漏数据:
SELECT * FROM users WHERE email REGEXP '@gmail\.com'; -- email为NULL的行不会被返回,但也不会报错
大小写敏感性取决于字段的collation。如果字段是utf8mb4_0900_as_cs(大小写敏感),'ABC' REGEXP 'abc'为FALSE;如果是utf8mb4_0900_ai_ci(不区分大小写),就为TRUE。别靠猜,查SHOW CREATE TABLE users;确认。
最关键的是:REGEXP无法使用B-tree索引,哪怕你给email建了索引,email REGEXP '^[a-z]+@'也会全表扫描。高频查询建议拆出结构化字段(如domain列)并建索引,正则只用于ETL或后台分析。
实际例子:验证邮箱格式和提取数字
验证基础邮箱(不追求RFC级严谨,够用):
SELECT email FROM contacts WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';提取字符串里的所有数字(MySQL 8.0+支持REGEXP_SUBSTR):
SELECT name, REGEXP_SUBSTR(phone, '[0-9]+') AS first_number FROM customers;
注意:REGEXP_SUBSTR在5.7不可用;若需兼容旧版,只能用嵌套SUBSTRING_INDEX+REPLACE硬凑,或者把清洗逻辑移到应用层。
正则本身不是银弹,尤其是跨版本MySQL里,字符集、引擎、collation、索引这几块稍不留意就会让查询慢十倍或结果错一半。


















