SELECT'Konzessionäre'REGEXP'[[:<:]] Konzession [[:>:]]'
它给了我结果 - 正如预期的那样 - 0
但如果我和BINARY运算符一起做同样的事情:
SELECTBINARY'Konzessionäre'REGEXP'[[:<:]] Konzession [[:>:]]'
结果是1,所以我认为regexp字边界检测和德语变音符号(就像这里的“ä”)和BINARY运算符一样存在MySQL问题。作为另一个例子,我可以做这个查询:
SELECTBINARY'Konzessionsäre'REGEXP'[[:<:]] Konzession [[:>:]]'
所以这里的结果是0 - 正如我所料。那我怎么解决这个问题呢?这可能是MySQL中的一个错误吗?
谢谢
答案 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有一个更好的正则表达式引擎。