在MySQL中搜索“全字匹配”

时间:2009-03-18 04:20:16

标签: mysql sql full-text-search

我想编写一个SQL查询,在文本字段中搜索关键字,但只有当它是“全字匹配”时(例如,当我搜索“rid”时,它不应该匹配“arid”,但它应该匹配“摆脱”。

我正在使用MySQL。

幸运的是,性能在这个应用程序中并不重要,数据库大小和字符串大小都很小,但我更喜欢在SQL中而不是在PHP中驱动它。

6 个答案:

答案 0 :(得分:140)

您可以使用REGEXP以及[[:<:]][[:>:]]字边界标记:

SELECT *
FROM table 
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'

答案 1 :(得分:26)

找到一个答案,以防止经典单词边界[[::<::]]与特殊字符发生冲突,例如。@#$%^&amp; *

替换..

SELECT *
FROM table 
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'

有了这个..

SELECT *
FROM table 
WHERE keywords REGEXP '([[:blank:][:punct:]]|^)rid([[:blank:][:punct:]]|$)'

后者匹配(空格,制表符等)|| (逗号,括号等)||开始/结束。一个更“完成”的单词边界匹配。

答案 2 :(得分:5)

你可以使用like和通配符标记来捕捉可能性(在开始,结束,中间和单独),这样就足够了:

选择等等等等     像'rid%'这样的列        或像'%rid'这样的列        或像'%rid%'这样的列        或column ='rid'

答案 3 :(得分:2)

使用带有字边界的regexp,但是如果你还想要重音不敏感搜索,请注意REGEXP是一个单字节操作符,所以没有什么可以得到utf8_general_ci校对,匹配不会对重音不敏感。

要使重音不敏感和整个单词匹配,请指定以(不建议使用的)PHP函数sql_regcase()执行的方式编写的单词。

事实上:

  • utf8_general_ci允许您进行相等(WHERE字段=值)大小写和重音不敏感搜索,但它不允许您指定整个单词匹配(单词边界标记无法识别)

  • LIKE允许您进行大小写和重音不敏感的搜索,但您必须手动指定可能的单词边界字符的所有组合(单词边界标记无法识别)

  • REGEXP支持字边界[[:&lt ;:]]和[[:&gt;:]],它是单字节函数,因此不要执行重音不敏感搜索。

    < / LI>

解决方案是使用带有字边界的REGEXP和以sql_regcase的方式修改的单词。

http://www.genovaperte.it

上使用

答案 4 :(得分:1)

select * from table where Locate('rid ', FieldToSearch) > 0 
      or Locate(' rid', FieldToSearch) > 0

这将处理找到它前面或后面的空格,你可以扩展方法考虑。,?!等等,不优雅而且容易。

答案 5 :(得分:1)

这是我到目前为止提出的最佳答案:

SELECT * FROM table 
WHERE keywords REGEXP '^rid[ $]' OR keywords REGEXP ' rid[ $]'

我会把它简化为:

SELECT *
FROM table
WHERE keywords REGEXP '[^ ]rid[ $]'

但[^]具有“非空格”的特殊含义,而不是“行开头或空格”。

REGEXP如何与多个LIKE条件进行比较? (并不是说这个应用程序的性能很重要。)