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
相关产品推荐
相关产品推荐

