gpt4 book ai didi

mysql - 如何在 mysql 正则表达式中匹配大写字母ÅÄÖ

转载 作者:可可西里 更新时间:2023-11-01 07:08:14 27 4
gpt4 key购买 nike

当我在 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”也不匹配。

我该怎么办?

最佳答案

我知道您已经找到了修复方法,但想解释一下它为何有效。 MySQL 中的 REGEXP 不适用于“字符”,但 works with bytes . Å、Ä、Ö、å、ä 和 ö 都是 UTF-8 中的两个字节字符。当它们用于正则表达式 [ ] 构造时,正则表达式引擎会单独查看这些字节中的每一个,并且只会尝试匹配一个字节而不是组成整个字符的两个字节。如果将这些字符分解成它们的组成字节,您就会明白为什么有些匹配是侥幸发生的。

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

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

关于mysql - 如何在 mysql 正则表达式中匹配大写字母ÅÄÖ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18851217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com