正则表达式返回莫名其妙的结果(对我而言)

时间:2014-05-29 02:48:41

标签: mysql regex unicode thai

我想从符合格式的表中返回条目:

前缀+可选空格+泰国数字

使用ยก作为前缀进行测试我使用以下SQL

SELECT term
FROM entries
WHERE term REGEXP "^ยก[\s]*[๐-๙]+$"

这会返回9个条目,其中4个条目没有正确的前缀,并且没有一个以数字结尾。

ยกนะ
ยกบัตร
ยกมือ
ยกยอ
ยกยอด
ยกหยิบ
ยมทูต
ยมนา
ยมบาล
ยมล

它不会返回

ยก ๑
ยก ๒
我知道

在数据库中,是我想要的条目。

我对这一切都很陌生。我做错了什么?

FWIW,这是针对MySQL数据库的,一切都是Unicode格式。

由于

2 个答案:

答案 0 :(得分:0)

引自MySQL docs

  

REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且可能会产生多字节字符集的意外结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能无法比较。

由于上述原因,似乎MySQL的REGEXP无法正确处理[๐-๙]范围。

答案 1 :(得分:0)

我使用utf8_general_ci并尝试匹配

ยกนะ 

与" ^ยก[\ s] * [0-9] + $"但是我没有将正则表达式改为

"^ยก[ ]*[๐-๙]+$"

,它可以匹配

ยกนะ 
ยก ๑

问题可能是字符编码。