2009-06-16 129 views

回答

19

等做通配符匹配的区别:

SELECT foo FROM bar WHERE foobar LIKE "Foo%" 

如果您不需要模式匹配,然后用=代替LIKE。它更快,更安全。 (您正在使用参数化查询,对吧?)

+0

谢谢。我以为LIKE可能会检查小拼写错误等 – 2009-06-16 19:34:06

26

=在SQL做精确匹配。

LIKE确实通配符匹配,使用“%”作为多字符匹配符号和“_”作为单字符匹配符号。 '\'是默认的转义字符。

foobar = '$foo'foobar LIKE '$foo'将表现相同,因为这两个字符串都不包含通配符。

foobar LIKE '%foo'会匹配任何在“富”的结局。

LIKE也有一个ESCAPE子句,所以你可以设置一个转义字符。这可以让你在字符串中匹配字面'%'或'_'。你也可以做NOT LIKE

MySQL的网站有documentation on the LIKE operator。语法是

expression [NOT] LIKE pattern [ESCAPE 'escape'] 
1

最终结果将是相同的,但查询引擎使用不同的逻辑来得到答案。通常,LIKE查询比“=”查询消耗更多的周期。但是,当没有通配符提供时,我不确定优化器如何处理该通配符。

3

the MYSQL Reference page,尾部的空格在LIKE显著但不是=和你可以使用通配符,%用于任何字符,而_用于一个字符。

0

OG谷歌一点点不伤......

一个WHERE如果我们想要做一个精确匹配等号(=)子句工作正常。但是可能有一个要求,我们希望过滤掉所有'foobar'应该包含“foo”的结果。这可以使用SQL LIKE子句和WHERE子句来处理。

如果用%字符一起使用SQL LIKE子句那么它会像一个通配符。

SELECT foo FROM bar WHERE foobar LIKE'$foo%' 

没有%字符LIKE子句与WHERE子句中的等号很相似。

0

在你的例子中,它们在语义上是相等的,并且应该返回相同的输出。

但是,LIKE会给你使用通配符进行模式匹配的能力。

您还应该注意=在某些系统上可能会提高性能,所以如果您是例如搜索exakt数字=,则会是首选方法。

0

看起来非常像从PHP脚本中取出。目的是将变量$foo的内容与foo数据库字段进行模式匹配,但我敢打赌它应该写在双引号中,所以$ foo的内容将被输入到查询中。

正如你所说,没有任何区别。

它可能会更慢,但我敢打赌,MySQL意识到搜索字符串中没有通配符,所以它毕竟不会做类似的模式匹配,所以真的没什么区别。

3

我认为速度=比LIKE快。如前所述,=完全匹配,如果需要,LIKE可以使用通配符。

我总是使用=符号,只要我知道某些东西的值。例如

select * from state where state='PA' 

那么对于喜欢我用的东西,如:如果您使用Oracle开发工具

select * from person where first_name like 'blah%' and last_name like 'blah%' 

,你可以测试它与解释,以确定数据库的影响。

0

在我来说,我觉得Like是快于=

  • Like获取的行数在0.203秒的第一时间,那么0.140秒

  • =收益在0.156秒获取相同的行不断

拿你的选择

+0

这可能只是意味着查询被缓存。 – Ben 2012-10-26 12:41:41

5

请记住,MySQL将根据情况执行铸件:LIKE将执行字符串转换,而=会执行int转换。考虑到局势:

(int) (vchar2) 
id field1 field2 
1 1  1 
2 1  1,2 

SELECT * FROM AS test一个 LEFT JOIN test为B ON a.field1样B。FIELD2

会产生

id field1 field2 id field1 field2 
1 1  1  1 1  1 
2 1  1,2  1 1  1 

SELECT * FROM AS test一个 LEFT JOIN test AS B关于a.field1 = b.field2

将产生

id field1 field2 id field1 field2 
1 1  1  1 1  1 
1 1  1  2 1  1,2 
2 1  1,2  1 1  1 
2 1  1,2  2 1  1,2 
+0

这是一个很好的观点,以field1(varchar列)值为“1234”为尾随空格的示例 - SELECT * FROM table1 WHERE field1 ='1234'将返回行,SELECT * FROM table1 WHERE field1 LIKE'1234 '不会... – Whisk 2016-06-17 10:34:20

0

我发现LIKE和等号=之间的一个重要区别!

示例:我有一个字段 “ID” 的表(类型:整数(20))和包含值 “123456789”

的记录如果我:

SELECT ID FROM example WHERE ID = '123456789-100' 

记录与ID = '123456789' 被找到(是不正确的结果)

如果我做的:

SELECT ID FROM example WHERE ID LIKE '123456789-100' 

无记录发现(这是正确的)

因此,至少对于INTEGER领域,它似乎是一个重要的区别...