如果我想在léon
字段中使用字符串name
搜索所有数据,我会使用如下查询:
SELECT * FROM `my_table` WHERE `name` REGEXP 'léon'
此请求没问题。
现在,我需要使用字符串léon
或leon
或lèon
检索所有行,所以我尝试了:
SELECT * FROM `my_table` WHERE `name` REGEXP 'l[éeè]on'
此查询不起作用...我没有错误,但没有结果。你有什么想法吗?
答案 0 :(得分:2)
MySQL的正则表达式don't work reliably with multibyte character sets。
但是,如果你使用的是UTF-8,你可以使用accent insensitive LIKE
and =
searches,看起来它可能就是你真正想要的东西。
答案 1 :(得分:0)
来自docs:
REGEXP和RLIKE运算符以字节方式工作,因此它们是 不是多字节安全的,并且可能会产生多字节的意外结果 字符集。另外,这些运算符比较字符 它们的字节值和重音字符可能无法相等 即使给定的校对将它们视为平等。
您可以尝试处理多字节字符,因此处理1个字节或2.它不会是完美的,因为它会匹配“狮子”,例如,但可能会让你更接近。
REGEXP 'l.{1,2}on'
可能影响到你的另一件事是REGEXP在MySQL中的工作方式是最终有隐含的通配符,因为你没有指定开头和结尾所以
REGEXP 'l[éeè]on'
相当于
REGEXP '^.*l[éeè]on.*$'
这意味着您的匹配可能超出预期。听起来你的问题是我提到的第一个场景