这里有一个棘手的问题。
假设我有表“books”,其中包含“title”列。我有一行 'title' = 'MyBook'。
我想使用 REGEXP 搜索书名,我想将所有可搜索的字符串引用到文字序列中:
SELECT * FROM books WHERE title REGEXP '\\QMyBook\\E';
当我使用 mariaDB 时,我的查询工作正常。 DB 识别这个引号。但是当我使用普通的 MySql 时,这个查询什么都不返回。问题不在于反斜杠,我认为 MySql 在使用“\Q”和“\E”时遇到麻烦。也许有办法以其他方式实现我的目标,但我真的不想单独转义每个字符。
我从 java 执行这个查询。但是来自控制台的普通查询以相同的方式工作
问题是 - 由于某些原因,确实有必要使用 REGEXP(而不是 LIKE)运算符。
但我不希望带有正则表达式特殊字符(例如“My.ook”)的查询在这里工作。我需要任何字符串,有或没有正则表达式特殊符号,由 mysql 作为文字序列处理(如果我们传递“点”——我们正在寻找“点”,而不是“任何字符”)
最佳答案
我不认为这可以用普通的 MySQL 完成,但如果你升级到 MariaDB,你可以使用你想要的语法。
更多信息请引用MariaDB的文档: https://mariadb.com/kb/en/mariadb/pcre/#quoting
SELECT * FROM books WHERE title REGEXP '\\QMyBook\\E';
我建议切换到 MariaDB,原因如下:
- 以前在 MySQL 中工作的一切在 MariaDB 中工作
- 您可以从任何客户端连接到 MariaDB,而无需更改 MySQL 配置(它实际上是 MySQL 的直接替代品)
- MariaDB 不属于 future 可能想要对功能收费的大公司
- MariaDB 带来了许多增强功能,包括更多 REGEXP 功能,例如您想要的功能和 REGEXP_REPLACE,以及其他改进。
此列表并不详尽。
关于java - 使用 MySQL 转义 REGEXP 中的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30076615/