在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的方式修改字。