MySQL查询字符串包含

ari*_*rik 276 php mysql sql string-comparison

我一直试图弄清楚如何用MySQL来查询$haystack某个列中的值(字符串)是否包含某些数据(字符串$needle),如下所示:

mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");
Run Code Online (Sandbox Code Playgroud)

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

WHERE substr(`column`, '{$needle}')=1
Run Code Online (Sandbox Code Playgroud)

Wol*_*lph 405

实际上非常简单:

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");
Run Code Online (Sandbox Code Playgroud)

%是任何角色的通配符.请注意,这可能会在非常大的数据集上变慢,因此如果您的数据库增长,则需要使用全文索引.

  • 这仅在您使用准备好的查询时才有效。如果您在其中使用实际字符串(例如 liquibase sql 升级脚本),请考虑下面提到的 INSTR。这是因为如果您的字符串包含一个 % 那么您将开始与它匹配。 (3认同)
  • 我知道类似的查询,但今天我想知道某些列中是否存在某些值,我正在谷歌搜索它.为什么我以前从未想过它? (2认同)
  • @angry_kiwi:使用`列LIKE'...'`它不区分大小写,`列LIKE BINARY'...'`它区分大小写 (2认同)
  • 我很惊讶,因为这个运算符使用两个通配符:`%`和`_`,因此建议使用`LIKE`来检查任何子字符串.这意味着如果你的字符串$ needle包含这个特殊字符之一,那么结果根本不是预期的.(-1)用于此回复,(+1)用于INSTR回复. (2认同)

OMG*_*ies 134

使用:

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0
Run Code Online (Sandbox Code Playgroud)

参考:

  • @oedo:取决于.`LIKE%...%`如果有一个索引将不会使用索引,所以它们应该是等价的; `LIKE ...%`如果存在则使用索引.如果性能是一个真正的问题,全文搜索(FTS)将是一个更好的方法. (17认同)
  • 我喜欢这种解决方案,因为实际上没有办法使用like操作符根据子字符串的存在对事物进行排序。使用`instr`,可以按这样的方式对短语进行排序,例如`instr(col1,“ mystring”)从表顺序中选择* (2认同)

chr*_*ris 51

WHERE `column` LIKE '%$needle%'
Run Code Online (Sandbox Code Playgroud)

  • @Wojtek _ 是任何单个字符的通配符,因此如果您想搜索文字下划线,则需要对其进行转义。请参阅 [MySQL LIKE 查询带下划线](/sf/ask/1551699271/)。 (3认同)
  • 搜索字符_(下划线)时,查询LIKE'%_%'不起作用,由于某种原因,即使没有_也返回所有字符串 (2认同)

ris*_*dar 25

LOCATE在mysql中使用:

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

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

在你的情况下:

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

  • 'column'应该是列(不带引号) (10认同)
  • @ValterEkholm,不。反引号是在 MySQL 中表示实体的正常方式。(如架构、表、表别名、列等)当您的列名为关键字或非常常见/不明确的术语(例如日期时间、日期、状态、名称等)时,它们特别有用。将它们用反引号括起来可以明确地表明它是一个实体,而不是关键字/函数/等。 (4认同)

Jos*_*ell 10

除了@WoLpH的回答.

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

如果您正在寻找以您的$needle:

... WHERE column LIKE '{$needle}%'
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找以以下结尾的字符串$needle:

... WHERE column LIKE '%{$needle}'
Run Code Online (Sandbox Code Playgroud)


小智 5

您可能正在寻找find_in_set功能:

Where find_in_set($needle,'column') > 0
Run Code Online (Sandbox Code Playgroud)

该函数的作用类似于in_arrayPHP 中的函数


Ale*_*eno 5

请注意,这是危险的:

WHERE `column` LIKE '%{$needle}%'
Run Code Online (Sandbox Code Playgroud)

先做:

$needle = mysql_real_escape_string($needle);
Run Code Online (Sandbox Code Playgroud)

所以它会阻止可能的攻击。

  • 您应该使用 [prepared statements](http://au1.php.net/pdo.prepared-statements),并将转义留给 PHP。`$stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();` (12认同)
  • *一些可能的攻击。此外,`mysql_real_escape_string` 将在未来的 PHP 版本中被弃用。 (7认同)