在MySQL中搜索文本列中的字符串

81
我有一个MySQL表,其中一列存储XML作为字符串。 我需要查找所有包含给定的6个字符字符串的XML列元组。 其他任何事情都不重要--我只需要知道是否存在这个6个字符的字符串。
所以,文本是否格式化为XML可能并不重要。
问题:我该如何在MySQL中搜索? 即 SELECT * FROM items WHERE items.xml [包含文本'123456'] 我能否使用LIKE运算符来实现这个目的?

请参考此链接:http://winashwin.wordpress.com/2012/08/28/mysql-search/ - user1573308
7个回答

146

1
我该如何修改这个查询以在PHP中使用?我有一个字符串 $message,我想选择具有完全相同字符串的行。我有 SELECT * FROM Messages WHERE from_id = '$fromID' AND to_id = '$toID' AND message LIKE '$message' 但我认为它不起作用。 - Hristo
如果“123456”是字符串的开头,那么它就不起作用了。 - tmarois
1
timothymarois - % 匹配零个或多个字符,因此如果您要搜索的字符串位于所搜索内容的开头、结尾或中间,则可以使用它。请参阅:https://www.w3schools.com/sql/sql_like.asp - LConrad
你可能也应该对它进行转义,参考链接:https://dev59.com/SVvUa4cB1Zd3GeqPpQRB。 - c00000fd

11

使用 like 可能需要更长时间,因此请使用 full_text_search

SELECT * FROM items WHERE MATCH(items.xml) AGAINST ('your_search_word')

11
这是否已被证明比 LIKE 更快? - Tim Baas
5
需要注意的是,为了使此功能起作用,需要在目标列上设置FULLTEXT索引。 - stamster
2
为了更好地为其他人扩展,全文搜索(FTS)与LIKE非常不同,后者会返回单词和短语的变体,而FTS则不会。例如,LIKE'%123456%'将返回带有“0123456”,“123456”,“1234567”等结果。而AGAINST('123456')仅返回作为匹配对象的单个单词的结果,例如“is 123456”,“123456”,“123456 is”等,但不会找到“0123456”或“1234567”。示例:https://www.db-fiddle.com/f/5rJUTdDtV63RybnY4U9L2W/0 这就是为什么FTS可以在较大数据集上更快地执行,因为它不执行LIKE所发生的完整表扫描。 - Will B.
如果该列没有完整的文本索引,这将失败。 - Marcelo Pacheco

7
为什么不使用LIKE?
SELECT * FROM items WHERE items.xml LIKE '%123456%'

6
SELECT * FROM items WHERE `items.xml` LIKE '%123456%'
LIKE 中的 % 运算符表示“任何内容都可以在此处”。

6
你的意思是:
SELECT * FROM items WHERE items.xml LIKE '%123456%'

1
当您使用WordPress的prepare语句时,上述解决方案无效。这是我使用的解决方案:
   $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);

0
尝试使用LOCATE函数。比LIKE更好,因为您无需对参数进行处理。 示例(Python):
cursor.execute('select columns from table where locate(%s,haystack)>0', (needle,))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接