使用BINARY运算符

时间:2018-02-12 15:58:04

标签: mysql regex character-set

我发现了一个奇怪的发现。如果我执行以下SQL-Command:

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

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

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

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

结果是1,所以我认为regexp字边界检测和德语变音符号(就像这里的“ä”)和BINARY运算符一样存在MySQL问题。作为另一个例子,我可以做这个查询:

SELECTBINARY'Konzessionsäre'REGEXP'[[:<:]] Konzession [[:>:]]'

所以这里的结果是0 - 正如我所料。那我怎么解决这个问题呢?这可能是MySQL中的一个错误吗?

谢谢

2 个答案:

答案 0 :(得分:0)

通过将字符串转换为BINARY,您已剥离其关联的字符集属性。因此,不清楚字边界模式应该如何匹配。我猜它只匹配ASCII值A-Z,a-z,0-9,还有_。

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

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

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

SELECT (BINARY 'Konzessionäre' REGEXP 'Konzession') AND ('Konzessionäre' REGEXP '[[:<:]]Konzession[[:>:]]')

答案 1 :(得分:0)

MySQL的REGEXP适用于字节,而不是字符。因此,在ä中,{{1}}是2个字节。目前还不清楚&#34;字边界的定义是什么?在这种情况下。

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