首页 > 解决方案 > 在 MySQL 中搜索“全词匹配”

问题描述

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

eg:我的表格列内容

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

问:

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

在上面的示例中,我需要选择与“邀请”匹配的所有记录。

标签: mysqlregex

解决方案


除了使用REGEXP,您还可以使用LIKE模式匹配运算符。

示例查询可能是:

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\\.';

[[:<:]]&[[:>:]]\b运算符为其边界提供了类似的功能。MySQL 5.7 更明确一点,您可以在页面底部的文档中看到。在 MySQL 8.0 中,它支持 Unicode 国际组件 (ICU),而 5.7 则使用 Henry Spencer 的正则表达式实现。

来自MySQL 8.0 文档

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

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

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

对我来说也有一点学习经验,谢谢 Wiktor!


推荐阅读