在 MySQL 的文本列中搜索字符串
Posted
技术标签:
【中文标题】在 MySQL 的文本列中搜索字符串【英文标题】:Search for string within text column in MySQL 【发布时间】:2011-02-01 09:02:25 【问题描述】:我有一个 mysql 表,其中有一列将 xml 存储为字符串。我需要找到 xml 列包含给定 6 个字符的字符串的所有元组。其他都不重要——我只需要知道这 6 个字符串是否存在。
因此,文本格式是否为 xml 可能并不重要。
问题:如何在mysql中进行搜索?
IE
SELECT * FROM items WHERE items.xml [contains the text '123456']
有没有办法可以使用 LIKE 运算符来做到这一点?
【问题讨论】:
参考这个:winashwin.wordpress.com/2012/08/28/mysql-search 【参考方案1】:当您使用 wordpress 准备行时,上述解决方案不起作用。这是我使用的解决方案:
$Table_Name = $wpdb->prefix.'tablename';
$SearchField = '%'. $YourVariable . '%';
$sql_query = $wpdb->prepare("SELECT * FROM $Table_Name WHERE ColumnName LIKE %s", $SearchField) ;
$rows = $wpdb->get_results($sql_query, ARRAY_A);
【讨论】:
【参考方案2】:使用like 可能需要更长的时间,所以使用full_text_search:
SELECT * FROM items WHERE MATCH(items.xml) AGAINST ('your_search_word')
【讨论】:
这是否被证明比 LIKE 更快? 重要的是要注意,要使其工作,需要在目标列上有FULLTEXT
索引。
为了进一步扩展,FTS 与LIKE
有很大不同,LIKE
将返回单词和短语的变体,而 FTS 不会。例如。 LIKE '%123456%'
将返回带有"0123456", "123456", "1234567"
等的结果。其中AGAINST('123456')
将只返回作为单个词的结果以匹配,例如"is 123456", "123456", "123456 is"
等,但不找到"0123456"
或"1234567"
。示例:db-fiddle.com/f/5rJUTdDtV63RybnY4U9L2W/0 这就是 FTS 可以在更大的数据集上执行得更快的原因,因为它不会像 LIKE
那样执行全表扫描。【参考方案3】:
你的意思是:
SELECT * FROM items WHERE items.xml LIKE '%123456%'
【讨论】:
【参考方案4】:您可能可以使用LIKE
clause 进行一些简单的字符串匹配:
SELECT * FROM items WHERE items.xml LIKE '%123456%'
如果您需要更高级的功能,请在此处查看 MySQL 的全文搜索功能:http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
【讨论】:
.. 我将如何修改它以与 php 查询一起使用?我有一个字符串$message
,我想选择具有该确切字符串的行。我有SELECT * FROM Messages WHERE from_id = '$fromID' AND to_id = '$toID' AND message LIKE '$message'
,但我认为这行不通
如果123456
是字符串的开头,那么它就不起作用了。
timothymarois - % 匹配零个或多个字符,因此如果所需字符串位于您正在搜索的内容的开头、结尾或中间,它将起作用。请参阅:w3schools.com/sql/sql_like.asp跨度>
你也应该escape it。【参考方案5】:
为什么不使用 LIKE?
SELECT * FROM items WHERE items.xml LIKE '%123456%'
【讨论】:
【参考方案6】:SELECT * FROM items WHERE `items.xml` LIKE '%123456%'
LIKE
中的 %
运算符表示“任何东西都可以在这里”。
【讨论】:
以上是关于在 MySQL 的文本列中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章