在MySQL中search“全字匹配”

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

我正在使用MySQL。

幸运的是,在这个应用程序中性能并不重要,数据库大小和string大小都很小,但是我宁愿在SQL中执行而不是在PHP中执行它。

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

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

find答案,以防止经典的单词边界[[::<::]]与特殊字符冲突,例如。@#$%^&*

更换..

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

有了这个..

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

后者匹配(空间,标签等)|| (逗号,括号等)|| 开始/结束行 更“完成”的字边界匹配。

 select blah blah blah where column like 'rid %' or column like '% rid' or column like '% rid %' or column = 'rid' 
 select * from table where Locate('rid ', FieldToSearch) > 0 or Locate(' rid', FieldToSearch) > 0 

这将处理查找前面或后面的空间,你可以扩展的方法来考虑。 等等,不是优雅而是容易的。

这是迄今为止我自己提出的最好的答案:

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

我会简化它:

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

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

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

使用带有单词边界的正则expression式,但是如果你还想重音不敏感的search,请注意REGEXP是一个单字节的运算符,所以没有什么值得拥有utf8_general_cisorting规则,匹配不会对变音不敏感。

要同时使用不区分重音和整个单词的匹配,请使用(不build议使用的)PHP函数sql_regcase()所做的相同方式指定单词。

事实上:

  • utf8_general_ci允许你做一个相等的(WHERE字段=值)大小写和重音不敏感的search,但它不允许你指定一个完整的单词匹配(单词边界标记不被识别)

  • LIKE允许你区分大小写和不区分重音的search,但你必须手动指定所有可能的单词边界字符的组合(字边界标记不被识别)

  • REGEXP支持单词边界[[:<:]]和[[:>:]],它是单字节函数,因此不执行不区分重音的search。

解决方法是使用带有字边界的REGEXP,并按照sql_regcase的方式修改字。

http://www.genovaperte.it上使用;