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

标签 mysql regex unicode

当我在 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/

相关文章:

Python 子进程 stdin=subprocess.PIPE 和 unicode

mysql - 检查是否超过 30 分钟

php - SQL 按日期排序 (D-M)

c# - 字符串解析,提取数字和字母

java - 替换正则表达式之间的所有字符

java - 如何使 JSONObject 的 toString() 将 UTF-8 字符编码为 un​​icode,就像 PHP 的 json_encode 中一样?

php - 将 ZingCharts 连接到 MySQL(构建折线图)

mysql - 流利的 Nhibernate 和 MySql,方言问题

python - 使用正则表达式解析大文本文件

python - 如何解码 python 中的非 unicode 字符?