MySQL 新正则函数的用法差异
较新版本在保留原有运算符的同时,加入了一组带参数的正则函数:判断、定位、截取与替换各有对应函数,并可通过匹配类型参数控制大小写、多行与换行行为。这批函数使用新的正则引擎,语法范围与旧实现不同,升级后既有语句的匹配结果也可能变化,因此不适合与旧写法混着用而不做验证。
基本信息
| 函数分工 | 判断类返回真假,定位类返回位置,截取类返回子串,替换类返回改写结果 |
|---|---|
| 参数结构 | 以源值、模式为主,可追加起始位置、出现次数与匹配类型 |
| 匹配类型 | 控制大小写敏感、多行锚点、点号是否匹配换行、行结束符处理 |
| 等价关系 | 原有运算符等价于判断类函数 |
典型使用场景
- 格式校验:判断字段是否符合约定形状,比手写多条条件更清晰
- 抽取片段:从混杂文本中截取符合模式的子串写入新字段
- 批量清洗:按模式替换噪声内容,例如去掉重复分隔符与多余空白
- 定位审计:返回匹配出现的位置,用于分析字段内部结构
- 迁移比对:对比新旧引擎下同一模式的命中差异,评估升级影响
四个函数的写法
四个函数的写法
-- 判断:等价于原有运算符,匹配类型 i 表示不区分大小写
SELECT id FROM users WHERE REGEXP_LIKE(email, '@example\\.com$', 'i');
-- 定位:返回匹配起始位置,未命中返回 0
SELECT REGEXP_INSTR(remark, '[0-9]{4}') AS pos FROM t;
-- 截取:返回匹配到的子串,未命中返回空值
SELECT REGEXP_SUBSTR(line, '[0-9]{4}-[0-9]{2}') AS ym FROM logs;
-- 替换:按模式改写,未命中时返回原串
SELECT REGEXP_REPLACE(phone, '[^0-9]', '') AS digits FROM t;
-- 多行与换行相关行为由匹配类型字符控制,组合使用需要逐个验证
SELECT REGEXP_LIKE(text, '^err', 'm') FROM logs;函数与返回值
| 函数 | 作用 | 未命中时的返回值 |
|---|---|---|
| 判断类 | 是否符合模式 | 返回假值 |
| 定位类 | 返回匹配位置 | 返回 0 |
| 截取类 | 返回匹配子串 | 返回空值 |
| 替换类 | 返回改写结果 | 返回原字符串 |
| 运算符形式 | 等价于判断类 | 同上 |
匹配类型参数能覆盖字段排序规则带来的默认行为:需要区分大小写时显式指定,处理多行文本时按需启用多行与换行相关选项,避免依赖列定义的隐含默认值。
升级引擎后语法范围与边界行为都会变化,历史语句中的简写字符类、锚点与空模式可能得到不同结果;升级前应抽取真实数据做对照查询,确认命中集合无意外变化。