MySQLクエリ文字列には


307

次のように$haystack、特定の列の値(string )に特定のデータ(string $needle)が含まれているかどうかをチェックするMySQLでクエリを作成する方法を理解しようとしています。

mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");

PHPでは、関数はと呼ばれるsubstr($haystack, $needle)ので、多分:

WHERE substr(`column`, '{$needle}')=1

回答:


437

実際にはかなり単純です:

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");

%設定された任意の文字(なし、1つ以上)のワイルドカードです。これは非常に大きなデータセットでは遅くなる可能性があるため、データベースが大きくなった場合はフルテキストインデックスを使用する必要があることに注意してください。


1
これは、準備されたクエリを使用している場合にのみ機能します。そこに実際の文字列を使用している場合(例:liquibase sql upgradeスクリプト)、次に述べるINSTRを検討してください)。これは、文字列に%が含まれている場合は、それに一致させるためです。
Ryan Shillington

2
クエリのようなことを知っていますが、今日、特定の値が文字列内の一部の列に存在するかどうかを調べたかったのです。
Sizzling Code

1
この大文字と小文字は区別されますか?
怒ったキウイ、2015年

2
@angry_kiwi:column LIKE '...'大文字と小文字を区別せず、大文字と小文字をcolumn LIKE BINARY '...'区別
Wolph

2
私は驚いてLIKE、この演算子は、2つのワイルドカード文字を使用していますので、任意の部分文字列をチェックするために提案されています%_。これは、文字列$ needleにこの特殊文字のいずれかが含まれている場合、結果が期待どおりにならないことを意味します。(-1)この応答の場合、および(+1)INSTR応答の場合。
Skrol29 2016年

144

使用する:

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0

参照:


確かにLIKEはINSTRよりも速いですか?
クリス

17
@oedo:依存します。 LIKE %...%存在する場合はインデックスを使用しないため、同等である必要があります。LIKE ...%存在する場合はインデックスを使用します。パフォーマンスが真の懸念事項である場合は、全文検索(FTS)がより良いアプローチになります。
OMGポニー

完璧。ちょうど私が探していたもの。
arik

2
実際には、like演算子付きの部分文字列の存在に従って物事を並べ替える方法がないため、この解決策が好きです。instrフレーズは次のように注文することができますselect * from table order by instr(col1,"mystring")
Radacina

フィールドで_を検索したかったのですが、うまくいきました。ありがとう
安全なAhmed

53
WHERE `column` LIKE '%$needle%'

2
文字_(アンダースコア)を検索すると、クエリLIKE '%_%'は機能しません。何らかの理由で、_がなくてもすべての文字列が返されます
Wojtek

1
@Wojtek _は任意の1文字のワイルドカードであるため、リテラルの下線を検索する場合はエスケープする必要があります。下線付きのMySQL LIKEクエリを参照してください。
jkmartindale

29

鉱山はLOCATEmysql で使用しています:

LOCATE(substr、str)、LOCATE(substr、str、pos)

この関数はマルチバイトセーフであり、少なくとも1つの引数がバイナリ文字列である場合のみ大文字と小文字が区別されます。

あなたの場合:

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");

11
'column'は列である必要があります(引用符なし)
Wojtek

10

@WoLpHからの回答に加えて。

LIKEキーワードを使用すると、文字列が一致する方向を制限することもできます。例えば:

あなたで始まる文字列を探していた場合$needle

... WHERE column LIKE '{$needle}%'

で終わる文字列を探していた場合$needle

... WHERE column LIKE '%{$needle}'

3

これは危険であることに注意してください:

WHERE `column` LIKE '%{$needle}%'

最初に行う:

$needle = mysql_real_escape_string($needle);

そのため、起こり得る攻撃を防ぎます。


7
*いくつかの可能な攻撃。また、mysql_real_escape_stringPHPの今後のリリースで廃止される予定です。
Jack Tuck

11
準備済みステートメントを使用、エスケープはPHPに任せる必要があります。 $stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
cloudworks 14

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.