MySQL正则表达式无法识别方括号中的俄文х?如何解决
解决MySQL正则匹配俄文“х”、英文“x”和星号“*”的问题
问题说明
原SQL使用俄文“х”作为分隔符可正常查询结果,但将其放入正则字符类[х]后返回0行,需实现同时支持俄文“х”、英文“x”和星号“*”作为数字分隔符,表编码为utf8_general_ci,引擎为InnoDB。
方案1:用OR拆分正则匹配(避开字符类问题)
直接写出三种分隔符对应的正则表达式,用OR连接。注意星号*在正则中是特殊量词,需用双反斜杠\\转义(SQL中单个反斜杠会被当作转义符):
SELECT * FROM `modx_site_content` AS `msProduct` WHERE `msProduct`.`pagetitle` REGEXP '300х250х625' OR `msProduct`.`pagetitle` REGEXP '300x250x625' OR `msProduct`.`pagetitle` REGEXP '300\\*250\\*625'
方案2:修正正则字符类写法(处理多字节字符)
若要使用字符类,需确保多字节的俄文“х”被正确识别,同时转义星号。可添加BINARY关键字强制按字节精确匹配,避免排序规则导致的字符混淆:
SELECT * FROM `modx_site_content` AS `msProduct` WHERE `msProduct`.`pagetitle` REGEXP BINARY '300[хx\\*]250[хx\\*]625'
方案3:改用LIKE匹配(更简单的兼容方式)
如果不需要复杂正则逻辑,用LIKE结合OR的方式更直接,LIKE在utf8_general_ci编码下能正确识别俄文“х”:
SELECT * FROM `modx_site_content` AS `msProduct` WHERE `msProduct`.`pagetitle` LIKE '%300х250х625%' OR `msProduct`.`pagetitle` LIKE '%300x250x625%' OR `msProduct`.`pagetitle` LIKE '%300*250*625%'
原写法[х]无效的原因
MySQL的REGEXP引擎处理utf8多字节字符时,字符类[]会将多字节字符拆分为单个字节匹配,导致无法识别完整的俄文“х”。utf8_general_ci的排序规则仅影响字符比较,不覆盖正则字符类的字节处理逻辑,因此直接放入多字节字符会匹配失败。
内容的提问来源于stack exchange,提问作者user153742
相关产品推荐
相关产品推荐

