【问题标题】:How do I find an exact word and not part of a word? [duplicate]如何找到一个确切的单词而不是单词的一部分? [复制]
【发布时间】:2012-12-19 08:37:04
【问题描述】:

可能重复:
MySQL - How to search for exact word match using LIKE?

例如,如果我试图获取带有单词“ever”的行,我可以这样做...

SELECT * FROM 'table' WHERE `title` LIKE %ever%

但这也会为我提供带有“永远,然而,永远”字样的标题的结果。

我怎样才能只找到包含“ever”作为自己的单词的标题?

【问题讨论】:

标签: mysql sql


【解决方案1】:

使用REGEXP 正则表达式在搜索词周围使用单词边界[[:<:]]word[[:>:]] 进行匹配:

SELECT * FROM `table` WHERE `title` REGEXP '[[:<:]]ever[[:>:]]'

请注意,默认情况下这是不区分大小写的。为了区分大小写,需要在BINARY模式下匹配:

SELECT * FROM `table` WHERE `title` REGEXP BINARY '[[:<:]]ever[[:>:]]'

由于它不能使用索引,但是在大型表上性能可能会很差。

编辑:抱歉,我有 PCRE 边界,MySQL 不支持。

【讨论】:

  • 我注意到这在一张大桌子上也很讨厌。
  • @NiLe 如果您对字符串中至少出现一次ever 感到满意,您可以使用instr,例如select * from table where instr(title,'ever') &gt; 0; instr 返回字符串中第一次出现的字符串。 ;) @MichaelBerkowski 在性能方面instrregex 快一点。
【解决方案2】:

您可以使用REGEXP 以及[[:&lt;:]][[:&gt;:]] 字边界标记:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2021-05-07
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多