虽然互联网上有很多使用现在不受支持的‘[:<:]]Word[[:>:]]’技术的"老"例子,但我正在try 了解如何在MySQL 8.0.30中从我们的表中进行精确的单词匹配,匹配其中包含特殊字符的单词.

例如,我们有一段文字,内容如下:

"Senior software engineer and C++ developer with Unit Test and JavaScript experience. I also have .NET experience!"

我们有一个与此相匹配的关键字表,并一直使用以下基本系统:

                    SELECT
                        sk.ID
                    FROM
                        sit_keyword sk
                    WHERE
                        var_text REGEXP CONCAT('\\b',sk.keyword,'\\b')

它在90%的情况下都工作得很好,但在以下情况下完全失败:

C#、C++、.NET、A+或"A+"等,因此它无法匹配关键字中的特殊字符.

我似乎找不到任何关于如何解决这一问题的最新文档,因为如前所述,我所能找到的几乎所有示例都使用旧的不受支持的技术.注意:我需要在源文本中的任何位置匹配这些单词(带有特殊字符),这样它可以是第一个或最后一个单词,或者位于中间的某个位置.

任何关于使用REGEXP进行此操作的最佳方式的建议都将不胜感激.

推荐答案

您需要转义搜索短语中的特殊字符,并使用我称之为"adaptive dynamic word boundaries"的 struct ,而不是单词边界:

var_text REGEXP CONCAT('(?!\\B\\w)',REGEXP_REPLACE(sk.keyword, '([-.^$*+?()\\[\\]{}\\\\|])', '\\$1'),'(?<!\\w\\B)')

仅当搜索短语以单词char开始/结束时,REGEXP_REPLACE(sk.keyword, '([-.^$*+?()\\[\\]{}\\\\|])', '\\$1')匹配. ^ $ * + - ? ( ) [ ] { } \ |个字符(在其前面添加\)和(?!\\B\\w)/(?<!\\w\\B)需要单词边界.

关于自适应动态单词边界的更多详细信息和my YT video中的演示.

Mysql相关问答推荐

无法从容器从APS. NET应用程序连接到MySQL服务器容器

可以在MySQL表名中使用表情包吗?

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

MySQL RDS ALTER TABLE ENUM短暂中断了我的数据库连接

SQL不断返回查询失败,并且不知道从这里到哪里go

SQL/Pyspark -判断条件

DJANGO 使用原始 MYSQL 查询计算记录数并在 html 模板中使用结果

状态为已发货的订单返回产品总数量的SQL(不同的两张表)

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

使用 Having 表达式连接多个表

MySQL Join 查询位置从订单

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

查询获取日期之间的可数匹配条目并加入它们以读取用户状态

基于两个单元格值的 SQL 过滤表

如何在 MySQL 中搜索多个列?

MAMP mysql 服务器无法启动.没有mysql进程正在运行

使用 Java 通过 SSH 连接到远程 MySQL 数据库

错误:无法构建 gem 本机扩展(rails 3.2.3 上的 mysql2)

SQL WHERE 列 = 一切

int(11) 和 int(11) UNSIGNED 有什么区别?