【问题标题】:Search for “whole word match” in MySQL [duplicate]在 MySQL 中搜索“全词匹配”[重复]
【发布时间】:2020-09-23 10:44:44
【问题描述】:

我想在 mysql 中使用 select 查询来搜索确切的单词

eg:我的表格列内容

"This is a sample mail to test Auto Decline Invitation."

问:

SELECT * FROM `test` where text REGEXP '[[:<:]]Invitation.[[:>:]]'

在上面的示例中,我需要选择与 'Invitation.'

匹配的所有记录

【问题讨论】:

  • 使用REGEXP '[[:&lt;:]]Invitation[.]'。或者,是 MySQL v8 吗?
  • MySQL的版本是多少?
  • 切换到FULLTEXT索引并使用MATCH(text) AGAINST('+invitation' IN BOOLEAN MODE)
  • @WiktorStribiżew 版本是 5.7.31
  • 好,REGEXP '[[:&lt;:]]Invitation[.]' 可以。

标签: mysql regex


【解决方案1】:

除了使用REGEXP,您还可以使用LIKE pattern matching 运算符。

示例查询可以是:

SELECT * FROM `test` WHERE `text` LIKE '%Invitation.%';

编辑

否则,如果LIKE不符合您的要求,您当然可以使用REGEXP

对于REGEXP (MySQL 5.7) 表达式,您需要使用(Wiktor 提到的):

SELECT * FROM `test` WHERE `text` REGEXP '[[:<:]]Invitation[.]';

对于REGEXP (MySQL 8.0) 表达式,您需要使用:

SELECT * FROM `test` WHERE `text` REGEXP '\\bInvitation\\.';

[[:&lt;:]] & [[:&gt;:]]\b 运算符为其边界提供了类似的功能。 MySQL 5.7 更明确一点,如页面底部的documentation here 所示。 MySQL 8.0 支持 International Components for Unicode (ICU),而 5.7 则使用 Henry Spencer 的正则表达式实现。

来自MySQL 8.0 docs

MySQL 使用 Unicode 国际组件 (ICU) 实现正则表达式支持,它提供完整的 Unicode 支持并且是多字节安全的。 (在 MySQL 8.0.4 之前,MySQL 使用 Henry Spencer 的正则表达式实现,它以字节方式运行并且不是多字节安全的。

如果您在此文档页面上搜索 \b,您会发现 ICU 与 Spencer 正则表达式处理之间的区别:

Spencer 库支持词首和词尾边界标记([[:&lt;:]][[:&gt;:]] 表示法)。 ICU没有。对于ICU,可以使用\b匹配单词边界;双反斜杠,因为 MySQL 将其解释为字符串中的转义字符。

对我来说也是一次学习经历,感谢 Wiktor!

【讨论】:

  • 我需要确切的词。我正在使用动态单词搜索。 'LIKE' 不适合使用精确的单词搜索。
  • 我明白了,我已经更新了我的答案。由于表达式中的点 (.),它可能会在您的查询中出错。
  • '[[:&lt;:]]Invitation[.][[:&gt;:]]' 是错误的。 . 不是单词字符。
  • 但是MySQL Reference Manual 上给出的允许的字符名称表明句点/句号是由它自己的字符分隔的,或者我可能理解不正确。我也用 MySQL v8 版本更新了我的答案。
  • 现在,5.7 和 8.0 版本的模式不同。实际上,第二个 \b 在您的最后一个模式中是多余的。请向 OP 解释一下。
猜你喜欢
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2023-01-02
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多