MySQL 查询字符串包含

Posted

技术标签:

【中文标题】MySQL 查询字符串包含【英文标题】:MySQL query String contains 【发布时间】:2011-02-05 19:58:13 【问题描述】:

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

SELECT *
FROM `table`
WHERE `column`.contains('$needle')

php中,该函数被称为substr($haystack, $needle),所以可能:

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

【问题讨论】:

【参考方案1】:

其实很简单:

SELECT *
FROM `table`
WHERE `column` LIKE '%$needle%'

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

【讨论】:

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

我在 mysql 中使用LOCATE

定位(substr,str), 定位(substr,str,pos)

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

在你的情况下:

SELECT * FROM `table`
WHERE LOCATE('$needle', `column`) > 0

【讨论】:

'column' 应该是列(不带引号) 'column' 不应该用反引号,对吧? @ValterEkholm,不,反引号是在 MySQL 中表示实体的正常方式。 (如模式、表、表别名、列等)当您有一个列命名为关键字或非常常见/模棱两可的术语(例如 DateTime、Date、Status、Name 等)时,它们特别有用。将它们包装在反引号中可以明确表明它是一个实体,而不是关键字/函数/等。【参考方案3】:
WHERE `column` LIKE '%$needle%'

【讨论】:

在搜索字符 _(下划线)时,查询 LIKE '%_%' 不起作用,由于某种原因,即使没有 _,它也会返回所有字符串 @Wojtek _ 是任何单个字符的通配符,因此如果要搜索文字下划线,则需要对其进行转义。见MySQL LIKE query with underscore。【参考方案4】:

您可能正在寻找find_in_set 函数:

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

此函数的作用类似于 PHP 中的 in_array 函数

【讨论】:

【参考方案5】:

除了@WoLpH 的回答。

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

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

... WHERE column LIKE '$needle%'

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

... WHERE column LIKE '%$needle'

【讨论】:

【参考方案6】:

注意这是危险的:

WHERE `column` LIKE '%$needle%'

先做:

$needle = mysql_real_escape_string($needle);

这样可以防止可能的攻击。

【讨论】:

*一些可能的攻击。此外,mysql_real_escape_string 将在未来的 PHP 版本中被弃用。 您应该使用prepared statements,并将转义留给PHP。 $stmt = $dbh->prepare("Where 'column' LIKE ':needle'"); $stmt->bindParam(':needle', $needle); $stmt->execute();【参考方案7】:

用途:

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

参考:

INSTR

【讨论】:

LIKE 肯定比 INSTR 快吗? @oedo:视情况而定。 LIKE %...% 如果存在索引,则不会使用索引,因此它们应该是等效的; LIKE ...% 将使用索引(如果存在)。如果性能是一个真正的问题,全文搜索 (FTS) 将是更好的方法。 完美。正是我一直在寻找的。​​span> 我喜欢这个解决方案,因为实际上没有办法根据带有 like 运算符的子字符串的存在对事物进行排序。使用instr 可以像这样对短语进行排序select * from table order by instr(col1,"mystring") 我想在一个字段中搜索 _ 并且它有效。谢谢

以上是关于MySQL 查询字符串包含的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询字符串包含

MySQL 查询某个字段包含一个字符串的SQL语句

mysql 查询不包含

如何SQL查询字段值包含于字符串

php+mysql模糊查询功能

Mysql字符串字段,如何判断是不是包含某个字符串