如果我想用字段中的字符串搜索所有数据léon
,name
我使用这样的查询:
SELECT * FROM `my_table` WHERE `name` REGEXP 'léon'
这个请求没问题。
现在,我需要使用字符串léon
or检索所有行leon
,lèon
所以我尝试了:
SELECT * FROM `my_table` WHERE `name` REGEXP 'l[éeè]on'
此查询不起作用...我没有错误,但没有结果。你有什么想法?
MySQL 的正则表达式不能可靠地处理多字节字符集。
但是,如果您使用的是 UTF-8,则可以改为使用不区分重音LIKE
和=
搜索,这看起来可能是您真正想要的。
从文档:
REGEXP 和 RLIKE 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会在使用多字节字符集时产生意外结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将它们视为相等,重音字符也可能不会比较相等。
您可以尝试像这样处理多字节字符,以便处理 1 个字节或 2 个字节。这并不完美,因为它会匹配例如“lion”,但可能会让您更接近。
REGEXP 'l.{1,2}on'
可能影响您的另一件事是 REGEXP 在 MySQL 中的工作方式是末尾有隐含的通配符,因为您没有指定开头和结尾,所以
REGEXP 'l[éeè]on'
相当于
REGEXP '^.*l[éeè]on.*$'
这意味着您匹配的结果可能比您预期的要多。听起来你的问题是我提到的第一个场景