我想编写一个SQL查询,该查询在文本字段中搜索关键字,但是仅当它是“全字匹配”时(例如,当我搜索“ rid”时,它不应该与“ arid”匹配,但是应该匹配“摆脱”。
我正在使用MySQL。
幸运的是,在该应用程序中性能并不是至关重要的,并且数据库大小和字符串大小都非常小,但是我更喜欢在SQL中而不是在驱动它的PHP中这样做。
Answers:
'[[:<:]]" . $rid . "[[:>:]]'
找到一个防止经典单词边界[[::<::]]
与特殊字符冲突的答案,例如。@#$%^&*
更换..
SELECT *
FROM table
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'
有了这个..
SELECT *
FROM table
WHERE keywords REGEXP '([[:blank:][:punct:]]|^)rid([[:blank:][:punct:]]|$)'
后者匹配(空格,制表符等)|| (逗号,括号等)|| 行的开始/结束。更“完善”的单词边界匹配。
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''([[[:blank:][:punct:]]' at line 3 SQLState: 42000 ErrorCode: 1064
想法吗?
'([[[
您可以使用like
通配符标记来捕获各种可能性(在开始,结束,中间和单独出现时),如下所示就足够了:
选择blah blah bla'blah blah blagh blah where where column like'rid%'or column like'%rid'or column like'%rid%'or column ='rid'
or column like '% rid, %' or column like 'rid, %'
。或使用上面的regex方法。
将regexp与单词边界一起使用,但是如果您还希望对重音不敏感,则请注意REGEXP是单字节运算符,因此utf8_general_ci排序规则毫无意义,匹配不会对重音不敏感。
要使重音不区分大小写和整个单词都匹配,请以(不建议使用的)PHP函数sql_regcase()相同的方式指定编写的单词。
事实上:
utf8_general_ci允许您进行等号(WHERE字段=值)区分大小写和重音的搜索,但不允许您指定整个单词匹配(单词边界标记无法识别)
LIKE允许您区分大小写和重音的不敏感搜索,但您必须手动指定可能的单词边界特征的所有组合(无法识别单词边界标记)
REGEXP支持单词边界[[:<:]]和[[:>:]],后者是单字节函数,因此请勿执行不区分重音的搜索。
解决方案是将REGEXP与单词边界一起使用,并且按照sql_regcase的方式修改单词。
到目前为止,这是我自己得出的最佳答案:
SELECT * FROM table
WHERE keywords REGEXP '^rid[ $]' OR keywords REGEXP ' rid[ $]'
我将其简化为:
SELECT *
FROM table
WHERE keywords REGEXP '[^ ]rid[ $]'
但是[^]的特殊含义是“不要有空格”,而不是“行首或空格”。
REGEXP与多个LIKE条件相比如何?(此应用程序的性能并不重要。)