【问题标题】:REGEXP with MySQL isn't working properly使用 MySQL 的 REGEXP 无法正常工作
【发布时间】:2013-05-03 13:08:50
【问题描述】:

如果我想在name 字段中搜索所有带有字符串léon 的数据,我会使用这样的查询:

SELECT * FROM `my_table` WHERE `name` REGEXP 'léon' 

这个请求没问题。

现在,我需要用字符串léonleonlèon 检索所有行,所以我尝试了:

SELECT * FROM `my_table` WHERE `name` REGEXP 'l[éeè]on' 

此查询不起作用...我没有错误,但没有结果。你有什么想法吗?

【问题讨论】:

  • 它适用于我......也许是版本的东西?你在哪个 MySQL 版本上运行?
  • 如果我尝试使用 SELECT * FROM my_table WHERE name REGEXP 'lé[o]n',没关系。所以我认为的版本没有问题。
  • 在小提琴中似乎不起作用 - sqlfiddle.com/#!2/78eb95/3
  • 我在 MySql 5.5 上运行,它运行得非常好。
  • 如果您使用 ISO-8859-x 字符集,它应该可以工作,如果您使用的是多字节字符集的 UTF-8,则不是那么多。

标签: mysql sql regex


【解决方案1】:

MySQL 的正则表达式 don't work reliably with multibyte character sets.

但是,如果您使用的是 UTF-8,则可以改用 accent insensitive LIKE and = searches,它看起来可能就是您真正想要的。

【讨论】:

    【解决方案2】:

    来自docs:

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

    您可以尝试像这样处理多字节字符,以便处理 1 个或 2 个字节。这并不完美,因为它会匹配例如“lion”,但可能会让您更接近。

    REGEXP 'l.{1,2}on'
    

    可能影响您的另一件事是 REGEXP 在 MySQL 中的工作方式是末尾有隐含的通配符,因为您没有指定开头和结尾,所以

    REGEXP 'l[éeè]on' 
    

    等价于

    REGEXP '^.*l[éeè]on.*$' 
    

    这意味着您匹配的结果可能比您预期的要多。听起来你的问题是我提到的第一个场景

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2012-05-29
      相关资源
      最近更新 更多