LIKE和REGEXP有什么区别?

时间:2012-05-03 07:33:57

标签: mysql

我有一个mySQL通配符查询无效,可能因为我使用的是InnoDB而不是MyISAM。

SELECT a.product_id, a.category_id FROM products a 
LEFT JOIN users u ON u.userid=a.ownerid 
WHERE a.active=1 AND a.approved=1 
AND a.deleted=0 AND a.name LIKE '%*my*%' 
AND a.name LIKE '%*donuts*%' 
AND (a.name REGEXP '( )*(*my*)*( )*(*donuts*)( )*') 

只要使用单词而不是通配符,它​​就可以正常工作,这不是问题。

我只是想知道,是

的一部分
(a.name REGEXP '( )*(*my*)*( )*(*donuts*)( )*') 

之后确实需要

LIKE '%*my*%' AND a.name LIKE '%*donuts*%'

有什么区别?

1 个答案:

答案 0 :(得分:4)

  

有什么区别?

  • 正则表达式

    (a.name REGEXP '( )*(*my*)*( )*(*donuts*)( )*')
    

    这会产生错误,因为量词(例如,未转义的*字符)在组的开头无效(即紧接在未转义的(字符之后)。忽略发生这种情况的两次产生:

    (a.name REGEXP '( )*(my*)*( )*(donuts*)( )*')
    

    这匹配任何a.name

    1. 零个或多个空格,然后是
    2. 零次或多次出现:

      • 字母m,后跟
      • 零个或多个字母y

      然后是

    3. 零个或多个空格,然后是
    4. 字符序列donut,后跟
    5. 零个或多个字母s,后跟
    6. 零个或多个空格
    7. 简单模式

      a.name LIKE '%*my*%' AND a.name LIKE '%*donuts*%'
      

      这匹配任何a.name

      1. 任何字符序列,后跟
      2. 字符序列*my*,后跟
      3. 任何字符序列
        1. 任何字符序列,后跟
        2. 字符序列*donuts*,后跟
        3. 任何字符序列