如何在 mysql 正则表达式中匹配大写 ÅäÖ

2024-05-03

当我在 MySQL 中进行 REGEXP 比较时,我得到了瑞典字符大写版本的一些奇怪结果。我正在使用 utf8_swedish_ci 排序规则,我想查找大写单词。

SELECT 'Öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$'应该返回 1 和SELECT 'öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$'应该返回 0,但我得到相反的结果。

SELECT 'Öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 0 (incorrect)
SELECT 'öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 1 (incorrect)
SELECT 'Söder' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 1 (correct)
SELECT 'söder' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 0 (correct)

如果我使用 REGEXP 而不是 REGEXP BINARY,“söder”也会匹配(这不是我想要的),但即便如此,“Öster”也不是匹配项。

我该怎么办?


我知道您已经找到了解决方案,但想解释一下它为何有效。REGEXP在 MySQL 中不能使用“字符”,但是使用字节 http://dev.mysql.com/doc/refman/5.1/en/regexp.html。 Å、ä、Ö、å、ä 和 ö 都是 UTF-8 中的两个字节字符。当它们在正则表达式中使用时[ ]构造时,正则表达式引擎单独查看这些字节中的每一个,并且仅尝试匹配一个字节而不是组成整个字符的两个字节。如果您将这些字符分解为它们的组成字节,您就会明白为什么某些匹配是偶然发生的。

使用正则表达式的修复'^([A-Z]|Å|Ä|Ö)[a-zåäö]+$'从技术上讲是可行的,但组成 å、ä 和 ö 的字节实际上不允许任何其他非预期的格式良好的 UTF-8 字符串意外匹配,这是偶然的。

我建议使用'^([A-Z]|Å|Ä|Ö)([a-z]|å|ä|ö)+$'为了清楚起见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 mysql 正则表达式中匹配大写 ÅäÖ 的相关文章

随机推荐