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 查询字符串包含的主要内容,如果未能解决你的问题,请参考以下文章