类通配符匹配的MySQL行为

类通配符匹配的MySQL行为,mysql,wildcard,sql-like,Mysql,Wildcard,Sql Like,我在表A中有以下数据 ID | Text --------------------------------------------- 1 | let's find this document 2 | docments are closed …如果我执行以下操作,请选择 select Text from TableA where Text like '%doc%'; …我似乎得到了一个奇怪的结果。两行都返回。通过此选择,它是否应该仅返回第1行?我本以为 select Text from T

我在表A中有以下数据

ID | Text
---------------------------------------------
1  | let's find this document
2  | docments are closed
…如果我执行以下操作,请选择

select Text from TableA where Text like '%doc%';
…我似乎得到了一个奇怪的结果。两行都返回。通过此选择,它是否应该仅返回第1行?我本以为

select Text from TableA where Text like 'doc%';
…将返回第2排。我错过什么了吗?


我要做的是,作为搜索工具的一部分,在这些数据上运行3次单独的搜索。第一个匹配是在字符串的开头查找指定的模式“doc”,第二个匹配是在字符串的结尾查找相同的模式,第三个匹配是确定该模式是否出现在文本中的任何位置,这样就可以让文本包围它。理想情况下,第一次搜索将只匹配第2行,第二次搜索将不返回结果,第三次搜索将只返回第1行。

这样做的原因是我想尝试了解模式如何匹配字符串。将使结果更容易读取,以知道给定行的模式(a)在开始时,(b)结束时,(c)在中间的任何地方。
BR>曾想过使用ReGEXP,但我的数据是Unicode。< /P> < /P> < P>不,第一个查询返回两行,因为<代码> %<代码>意味着<强> 0 < /强>或更多字符。因此,如果字段中第一个出现的是
doc
,那么它也与
%doc%
模式匹配


但是第二个查询是对的,它只返回第2行。

否,第一个查询同时返回两行,因为
%
表示0或更多字符。因此,如果字段中第一个出现的是
doc
,那么它也与
%doc%
模式匹配

但第二个查询是对的,它只返回第2行

  • doc%
    应该在开头匹配,后面至少有一个字符
  • %\u doc
    应在末尾与之匹配,前面至少有一个字符
  • %\u doc%
    应在任何位置匹配它,前后至少有一个字符
  • 请注意,这些严格的标准无法找到确切的字符串“doc”,即前后都没有。您可能希望通过松开查询#1,将此情况包括在查询#1中:

  • doc%
    应该在开头匹配,后面有任意数量的字符
  • doc%
    应该在开头匹配,后面至少有一个字符
  • %\u doc
    应在末尾与之匹配,前面至少有一个字符
  • %\u doc%
    应在任何位置匹配它,前后至少有一个字符
  • 请注意,这些严格的标准无法找到确切的字符串“doc”,即前后都没有。您可能希望通过松开查询#1,将此情况包括在查询#1中:

  • doc%
    应该在开头匹配,后面有任意数量的字符

  • 你想完成什么?您基本上说明了MySQL所做的事情——这并不是什么不同寻常的事情。也许,如果你解释一下你的最终目标是什么,我们就可以回答你想要做的事情。是任何字符的替代品,不包括任何字符。因此,据
    %doc
    所知,“doc”与“doc”相同,它更新了我的原始帖子,并提供了更多关于我最终目标的信息。如果是任何字符,而不是“no”字符,该怎么办。我在考虑所有三个比赛练习的综合结果,这将导致混乱,因为第一排和第二排将同时匹配测试1和测试3。我会遇到一些问题,比如“文档已关闭”如何可以是“字符串开头的匹配”和“字符串中任何位置的匹配”。你想实现什么?您基本上说明了MySQL所做的事情——这并不是什么不同寻常的事情。也许,如果你解释一下你的最终目标是什么,我们就可以回答你想要做的事情。是任何字符的替代品,不包括任何字符。因此,据
    %doc
    所知,“doc”与“doc”相同,它更新了我的原始帖子,并提供了更多关于我最终目标的信息。如果是任何字符,而不是“no”字符,该怎么办。我在考虑所有三个比赛练习的综合结果,这将导致混乱,因为第一排和第二排将同时匹配测试1和测试3。我会被问到“文档已关闭”如何可以是“字符串开头的匹配”和“字符串中任何位置的匹配”。