1

我有了一个奇怪的发现。如果我执行以下 SQL 命令:

SELECT 'Konzessionäre' REGEXP '[[:<:]]Konzession[[:>:]]'

它给了我结果 - 正如预期的那样 - 0

但如果我与 BINARY 运算符一起做同样的事情:

SELECT BINARY 'Konzessionäre' 正则表达式 '[[:<:]]Konzession[[:>:]]'

结果是 1,所以我认为正则表达式单词边界检测和德语变音符号(如这里的“ä”)与 BINARY 运算符一起存在 MySQL 问题。作为另一个例子,我可以做这个查询:

SELECT BINARY 'Konzessionsäre' 正则表达式 '[[:<:]]Konzession[[:>:]]'

所以这里的结果是 0 - 正如我所期望的那样。那么我该如何解决呢?这可能是MySQL中的错误吗?

谢谢

4

2 回答 2

1

通过转换您的字符串,因为BINARY您已经剥离了其关联的字符集属性。所以不清楚单词边界模式应该如何匹配。我猜它只匹配 ASCII 值 AZ、az、0-9 和 _。

当将字符串转换为BINARY时,MySQL 对也应该被视为字母数字的任何其他更高的字符值一无所知,因为哪些字符应该是字母数字取决于字符集。

我猜您正在使用BINARY它来使其成为区分大小写的正则表达式搜索。显然,这具有破坏词边界模式匹配的意外后果。

您不应BINARY在此比较中使用。您可以进行二次比较以检查区分大小写的匹配,但不能检查单词边界。

SELECT (BINARY 'Konzessionäre' REGEXP 'Konzession') AND ('Konzessionäre' REGEXP '[[:<:]]Konzession[[:>:]]')
于 2018-02-12T16:18:27.837 回答
1

MySQL 的 REGEXP 使用字节,而不是字符。因此, inCHARACTER SET utf8ä2 个字节。目前尚不清楚在这种情况下“词界”的定义是什么。

MariaDB 的最新版本具有更好的正则表达式引擎。

于 2018-02-21T02:28:48.640 回答