通配符LIKE匹配的MySQL行为

时间:2013-01-16 13:55:38

标签: mysql wildcard sql-like

我在TableA中有以下数据......

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)在中间的任何地方相匹配。

有过考虑使用正则表达式,但我的数据是unicode。

2 个答案:

答案 0 :(得分:3)

不,第一个查询会返回两行,因为%表示 0 或更多字符。因此,如果doc是字段中出现的第一个内容,它也会匹配%doc%模式。

但是你在第二个查询上是正确的,它只会返回第2行。

答案 1 :(得分:1)

  1. doc_%应该在开头匹配它,后面至少有一个字符。
  2. %_doc最后应匹配,前面至少有一个字符。
  3. %_doc_%应该在任何地方匹配,在之前至少有一个字符,然后
  4. 请注意,这些严格的标准失败以找到确切的字符串“doc”,即在其之前或之后没有任何内容。您可能希望将此案例包含在查询#1中,方法是放松它:

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