MySQL查询字符串包含


307

我一直在尝试找出如何使用MySQL进行查询,以检查$haystack某列中的值(string )是否包含某些数据(string $needle),如下所示:

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

在PHP中,该函数称为substr($haystack, $needle),因此可能:

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

Answers:


437

实际上很简单:

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

%是用于设置任何字符(无,一个或多个)的通配符。请注意,这在非常大的数据集上会变慢,因此,如果数据库增长,则需要使用全文索引。


1
仅当您使用准备好的查询时,这才起作用。如果您在其中使用实际字符串(例如liquibase sql升级脚本),请考虑下面提到的INSTR。这是因为,如果您的字符串包含%,那么您将开始对其进行匹配。
瑞安·希灵顿

2
我知道类似的查询,但是今天我想知道某个列中是否存在某些值,而我却在搜索它。为什么我以前从未想到过?
令人眼花Code乱的代码

1
这个区分大小写吗?
愤怒的猕猴桃,2015年

2
@angry_kiwi:column LIKE '...'不区分大小写,不区分column LIKE BINARY '...'大小写
Wolph 2015年

2
令我惊讶的LIKE是,由于该运算符使用两个通配符:%和,因此建议检查任何子字符串_。这意味着,如果您的字符串$ needle包含此特殊字符之一,则结果根本不符合预期。(-1)表示此回复,(+ 1)表示INSTR回复。
Skrol29年

144

采用:

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

参考:


当然,LIKE比INSTR快吗?
克里斯,2010年

17
@oedo:取决于。 LIKE %...%如果存在索引,则不会使用索引,因此它们应该等效;LIKE ...%如果存在,将使用索引。如果真正关心性能,则全文搜索(FTS)将是更好的方法。
OMG Ponies,2010年

完善。就是我一直在寻找的东西。
阿里克

2
我喜欢这种解决方案,因为实际上没有办法根据带有likeoperator 的子字符串的存在对事物进行排序。随着instr一个短语可以责令这样select * from table order by instr(col1,"mystring")
Radacina

我想在一个字段中搜索_,并且有效。谢谢
安全的艾哈迈德(Ahmed)

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

2
当搜索字符_(下划线)时,查询LIKE'%_%'不起作用,由于某种原因,即使没有_,它也会返回所有字符串
-Wojtek

1
@Wojtek _是任何单个字符的通配符,因此,如果要搜索文字下划线,则需要对其进行转义。请参阅带下划线的MySQL LIKE查询
jkmartindale

29

我的LOCATE在mysql中使用:

LOCATE(substr,str),LOCATE(substr,str,pos)

此函数是多字节安全的,并且仅当至少一个参数是二进制字符串时才区分大小写。

在您的情况下:

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

11
“列”应为列(不带引号)
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_string在将来的PHP版本中将不推荐使用。
杰克塔克2014年

11
您应该使用准备好的语句,并将转义留给PHP。 $stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
cloudworks 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.