【问题标题】:How can I match capital ÅÄÖ in mysql regexp如何在 mysql regexp 中匹配大写 ÅÄÖ
【发布时间】:2013-09-21 23:20:15
【问题描述】:

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

我该怎么办?

【问题讨论】:

  • 请注意,utf8_swedish_ci 中的 _ci 代表不区分大小写。确保您运行的任何应用程序和终端也使用 utf-8,以便您输入的 SQL 实际上以 utf-8 形式发送到 mysql
  • @nos 是的,这就是我使用BINARY 的原因,它似乎适用于 A-Z、a-z 和 åäö,但不适用于 ÅÄÖ。我使用 phpMyAdmin 并将服务器连接排序规则更改为 utf8_swedish_ci。

标签: mysql regex unicode


【解决方案1】:

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

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

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

【讨论】:

  • 是的,这是有道理的。
  • 瑞典语中大写单词能否以É开头?
【解决方案2】:

经过更多实验,我发现像这样更改正则表达式的大写部分可以解决问题:

SELECT 'Öster' REGEXP BINARY '^([A-Z]|Å|Ä|Ö)[a-zåäö]+$'

我不明白为什么这会产生不同的结果。

【讨论】:

    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2011-12-21
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多