2017-02-26 11 views
0

パフォーマンス以外のこれら2つのクエリの結果に違いはありますか?パーセント記号のないSQL LIKEとWHERE句の等号(=)の相違

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]; 
+0

DBMSが標準SQLに従っている場合、末尾にスペースがあると違いがあります。「名前のような 'Spot」は「Spot」とは一致しませんが、「=」はそれになります。 – dnoeth

答えて

2

、ワイルドカードなし有するLIKE=と機能的に同等です。しかし、彼らは同じではありません!明らかな違いは、=\,%および_を特別な方法で処理しませんが、LIKEは処理しません。

documentationこの上でかなり明確である:標準SQLでは、文字単位のベースでマッチングLIKE行い、 当たり

従って、それは=比較演算子とは異なる結果を生成することができる:

照合の違いに加えて

、末尾のスペースは問題:特に

、末尾スペースは=演算子で行わ CHARまたはVARCHARの比較のために真実ではないである、重要である:

実際には、比較される文字列は、通常、同じ照合順序を持つ末尾のスペースを持っていない、と特殊文字です無視されるので、=の代わりにLIKEが使用されることがあります(特に、パターンの先頭にワイルドカードを付けないとLIKEはインデックスも使用できます)。

0

が効果的に、それはあなたの例では同じものであることが判明したが、ここでは詳細は次のとおりです。another stackoverflow answer

から

=数値や文字列で動作する比較演算子です。文字列を比較するとき、比較演算子は文字列全体を比較します。

LIKEは文字を文字単位で比較する文字列演算子です。

関連する問題