不带百分号的SQL LIKE和WHERE子句

时间:2017-02-26 15:01:12

标签: mysql sql

除性能外,这两个查询的结果是否存在差异?

SELECT * FROM pet WHERE name LIKE 'Spot';
SELECT * FROM pet WHERE name = 'Spot';

我问的原因是真实的脚本将类似于以下内容,API用户负责提出模式。更常见的情况是,不会提供LIKE模式,但总是有可能只提供一个字符串,从而产生SELECT * FROM pet WHERE name LIKE "Spot"

$stmt = $this->pdo->prepare('SELECT * FROM pet WHERE name LIKE ?');
$stmt->execute([$_GET['name']]); //Spot
return [$stmt->fetchAll(),200];

2 个答案:

答案 0 :(得分:3)

练习中,没有通配符的LIKE在功能上等同于=。但是,他们不一样!明显不同的是,=不会以任何特殊方式处理\%_,但LIKE会这样做。

documentation非常明确:

  

根据SQL标准,LIKE基于每个字符执行匹配,   因此它可以产生与=比较运算符不同的结果:

除了排序规则差异外,尾随空格很重要:

  

特别是,尾随空格很重要,但事实并非如此   使用=运算符执行CHARVARCHAR次比较:

实际上,被比较的字符串通常具有相同的排序规则,没有尾随空格,并且忽略了特殊字符,因此LIKE有时用作=的替代(特别是因为在模式开头没有通配符的LIKE也可以使用索引。

答案 1 :(得分:1)

实际上,事实证明在你的例子中它是相同的,但这里有更多信息:

来自another stackoverflow answer

  

=是一个对数字和字符串进行操作的比较运算符。比较字符串时,比较运算符会比较整个字符串。

     

LIKE是一个字符串运算符,用于逐字符比较。