You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8迁移后REGEXP正则表达式语法错误求助

问题原因

MySQL 8.0 默认采用ICU正则表达式引擎,而MySQL 5.7使用POSIX正则引擎。ICU对正则语法的校验更严格:当正则表达式为单独的*时,会触发语法错误(因为*是量词,必须跟在可匹配的元素之后),但5.7的POSIX引擎会忽略这类无效语法或按匹配任意内容处理。

你的查询中,WHERE子句因为有OR REG_EX_ERROR_MESSAGE = '*'的判断,不会触发错误;但ORDER BY子句里的1 REGEXP REG_EX_ERROR_MESSAGE,当REG_EX_ERROR_MESSAGE的值为*时,会直接触发ICU的正则语法报错。

解决方法

提供两种可行的修改方案:

方案1:优先判断特殊值,避免无效正则解析

修改ORDER BY中的CASE条件,先判断REG_EX_ERROR_MESSAGE是否为*,再执行正则匹配:

SELECT * FROM rainy_day_handler_macro 
WHERE FLOW_NAME = "XX"  
AND SERVICE_TYPE IN ('*' ,'*') 
AND VNF_TYPE IN ( 'xx' , '*') 
AND ERROR_CODE IN ('MSOWorkFlowException'  ,'*') 
AND WORK_STEP IN ('*' , '*' ) 
AND ( 'XX' REGEXP rainy_day_handler_macro.REG_EX_ERROR_MESSAGE OR REG_EX_ERROR_MESSAGE = '*') 
AND SERVICE_ROLE IN ( "*" , '*') 
ORDER BY 
    CASE 
        WHEN REG_EX_ERROR_MESSAGE = '*' OR 1 REGEXP REG_EX_ERROR_MESSAGE THEN 0 
        WHEN ERROR_CODE != '*' THEN 1 
        WHEN VNF_TYPE != '*' THEN 2 
        WHEN SERVICE_TYPE != '*' THEN 3 
        WHEN SERVICE_ROLE != '*' THEN 4 
        ELSE 5 
    END 
LIMIT 1;

方案2:强制使用POSIX正则引擎(保持5.7兼容)

使用REGEXP_LIKE函数并指定'p'参数,让MySQL沿用POSIX正则引擎的处理逻辑:

SELECT * FROM rainy_day_handler_macro 
WHERE FLOW_NAME = "XX"  
AND SERVICE_TYPE IN ('*' ,'*') 
AND VNF_TYPE IN ( 'xx' , '*') 
AND ERROR_CODE IN ('MSOWorkFlowException'  ,'*') 
AND WORK_STEP IN ('*' , '*' ) 
AND ( REGEXP_LIKE('XX', REG_EX_ERROR_MESSAGE, 'p') OR REG_EX_ERROR_MESSAGE = '*') 
AND SERVICE_ROLE IN ( "*" , '*') 
ORDER BY 
    CASE 
        WHEN REG_EX_ERROR_MESSAGE = '*' OR REGEXP_LIKE(1, REG_EX_ERROR_MESSAGE, 'p') THEN 0 
        WHEN ERROR_CODE != '*' THEN 1 
        WHEN VNF_TYPE != '*' THEN 2 
        WHEN SERVICE_TYPE != '*' THEN 3 
        WHEN SERVICE_ROLE != '*' THEN 4 
        ELSE 5 
    END 
LIMIT 1;

内容的提问来源于stack exchange,提问作者Shubham Shekhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:43:12