2010-04-08 94 views
201

我一直在试图找出我怎么能做出与MySQL查询来检查,如果在某列的值(字符串$haystack)包含某些数据(字符串$needle),像这样:MySQL查询字符串包含

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

在PHP中,函数被调用substr($haystack, $needle),所以也许:

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

回答

291

其实很简单:

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

%是任何字符的通配符。请注意,对于非常大的数据集,这可能会变慢,所以如果数据库增长,则需要使用全文索引。

+0

这只会在您使用准备好的查询时起作用。如果你在那里使用一个实际的字符串(例如liquibase sql升级脚本),那么考虑下面提到的INSTR)。这是因为如果你的字符串包含%,那么你将开始与它匹配。 – 2012-10-03 17:51:11

+2

我知道类似查询,但今天我想知道是否某些值存在于字符串中的某个列中,我正在使用它进行搜索。为什么我从来没有想过它? – 2014-10-09 09:15:20

+0

是否区分大小写? – 2015-01-21 12:10:14

34
WHERE `column` LIKE '%$needle%' 
+0

当搜索字符_(下划线)时,查询LIKE'%_%'不起作用,因为某些原因,它将返回所有字符串,即使没有_ – Wojtek 2017-05-18 12:20:25

103

用途:

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

参考:

+0

LIKE肯定比INSTR更快? – oedo 2010-04-08 17:58:31

+10

@oedo:取决于。 'LIKE%...%'如果有的话不会使用索引,所以它们应该是等价的; 'LIKE ...%'会使用索引(如果存在)。如果性能是一个真正的问题,全文搜索(FTS)将是一个更好的方法。 – 2010-04-08 17:59:54

+0

完美。就是我一直在寻找的东西。 – arik 2010-04-08 19:59:53

8

除了从@WoLpH答案。

使用LIKE关键字时,您还可以限制字符串匹配的方向。例如:

如果您正在寻找与您$needle开头的字符串:

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

如果你正在寻找一个与$needle结尾的字符串:

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

矿用LOCATE在MySQL:

LOCATE(SUBSTR,STR),LOCATE(SUBSTR,STR ,POS)

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

你的情况:

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

'column'应该是列(不含引号) – Wojtek 2017-05-18 12:16:24

-1

你可能正在寻找find_in_set功能:

Where find_in_set($needle,'column') > 0 

这个功能就像in_array函数在PHP

2

意识到,这是很危险的:

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

先做:

$needle = mysql_real_escape_string($needle); 

以免其可能的攻击。

+6

*一些可能的攻击。另外,'mysql_real_escape_string'将在未来的PHP版本中被弃用。 – 2014-02-03 21:24:01

+0

相关知识:-) – 2014-02-08 15:24:33

+7

您应该使用[prepared statements](http://au1.php.net/pdo.prepared-statements),并将转义保留给PHP。 '$ stmt = $ dbh-> prepare(“Where'列'LIKE'{:needle}'”); $ stmt-> bindParam(':needle',$ needle); $ stmt-> execute();' – cloudworks 2014-03-03 05:25:04