【问题标题】:Finding MySQL records that contain an exact string查找包含精确字符串的 MySQL 记录
【发布时间】:2025-11-30 16:05:02
【问题描述】:

我正在开展一个项目,该项目需要查找包含精确字符串或作为精确格式一部分的相同字符串的记录。换句话说,如果字符串是“hello world”,可能会说... 数据库中有 10 条记录具有此字段值,但该字段可能是以下之一:

"1. hello world"
"1 hello world"
"hello world"
"hello world (xyz)"
"1. hello world (xyz)"
"1 hello world (zyx)"

字符串“hello world”可以是任何东西,但前缀总是以数字开头或不存在,而后缀总是以括号结尾或不存在。

我以为我已经用以下正则表达式破解了它,但这并没有返回任何记录:

WHERE fieldname REGEXP '^([0-9]+.*)?[[:<:]]hello world[[:>:]](.*\))?$'

此外,我以前从未使用过 [[:<:>:]] 并假设这是要走的路,我不确定如何在之间转义文本,因为这将是 PHP生成?文档说要加倍转义的反斜杠,所以我猜 mysql_real_escape_string 还不够......?

如往常一样,任何建议都将不胜感激。

【问题讨论】:

  • LIKE '%hello world%' 怎么样?见this
  • 不幸的是,一个基本的 LIKE 是不够的,因为我需要排除不遵循这种格式的记录。例如“不同的你好世界(xyz)”或“1.你好世界二”
  • 可以试试like this'^([0-9].*)?[[:&lt;:]]hello world($|[[:&gt;:]].+[)]$)'
  • 哦,这似乎行得通!令人沮丧的是,这种方法似乎比组合一堆 LIKE 慢,但作为对我问题的回答,你已经解决了,谢谢。请张贴作为答案,我会接受。

标签: mysql regex


【解决方案1】:

您可以尝试将最后一部分 [[:&gt;:]](.*\))?$ 更改为替代方案。

^([0-9].*)?[[:<:]]hello world($|[[:>:]].+[)]$)

SQL Fiddle

如果不确定转义,请尝试将特殊字符放入字符类[)]see this question 以转义字符串的动态部分。

【讨论】:

  • 完全符合我的预期,谢谢。烦人的是,一个 REGEXP 似乎比多个 LIKE 慢 4 倍,毕竟! pastebin.com/dcQTQENp
  • @Ric 您还可以尝试将第一部分 ^([0-9].*)?[[:&lt;:]] 切换为 (^|^[0-9].*[[:&lt;:]]) 没有测试这是否会使用索引(使用 EXPLAIN)。否则是的 - 可能您需要拆分为多个查询以获得更好的性能。
【解决方案2】:

试试这个

WHERE fieldname LIKE '%hello world%'

您可以阅读有关“LIKE”here 的更多信息。

【讨论】:

  • 不幸的是,一个基本的 LIKE 是不够的,因为我需要排除不遵循这种格式的记录。例如“不同的你好世界(xyz)”或“1.你好世界二”
  • 那么你到底想要什么?
  • 这是行得通的,但它太慢了,即使有索引。我希望用一个正则表达式搜索替换.. pastebin.com/dcQTQENp