mySQL 查询在数据库中的所有表中搜索字符串?

Posted

技术标签:

【中文标题】mySQL 查询在数据库中的所有表中搜索字符串?【英文标题】:mySQL query to search all tables within a database for a string? 【发布时间】:2011-11-23 07:05:07 【问题描述】:

是否有用于搜索数据库中所有表的 mySQL 查询?

如果不能,您可以从 mysql 工作台 GUI 搜索数据库中的所有表吗?

phpmyadmin 中,您可以使用一个搜索面板选择所有表格 进行搜索。我发现这非常有效,因为我正在使用的电子商务包 magento 有数百个表格,并且不同的产品详细信息位于不同的表格中。

【问题讨论】:

Search in all fields from every table of a MySQL database的可能重复 我建议在 DROP PROCEDURE IF EXISTS get_table $$ 之前添加行 SET sql_notes = 0$$ 否则会显示警告PROCEDURE 不存在。 【参考方案1】:

在数据库的所有表中搜索字符串是一项复杂的任务。通常,您不需要完全使用所有表格,并且如果没有特定布局(匹配的表格树等),结果阅读起来很复杂

SQL Workbench/J 提供了 GUI 和命令行版本来执行此类任务:

更多信息:

http://www.sql-workbench.net/manual/wb-commands.html#command-search-data http://www.sql-workbench.net/manual/dbexplorer.html#search-table-data

注意:如果配置不正确,使用 JDBC 驱动程序进行搜索会占用大量内存。 SQL Workbench/J 对此发出警告,尽管在线文档有点过时,但文档来源 (doc/xml/db-problems.xml) 解释了如何针对不同的 BBDD 修复它:

这里是 Postgres 的摘录:

PostgreSQL JDBC 驱动默认缓冲从数据库获取的结果 在将它们返回到应用程序之前在内存中。这意味着在检索数据时,&wb-productname;使用(在短时间内)两倍于实际需要的内存。这也意味着 WbExport 或 WbCopy 将 在将结果写入输出文件之前有效地将整个结果读入内存。 对于大型出口,这通常是不希望的。 可以更改驱动程序的这种行为,以便驱动程序使用基于光标的检索。 为此,连接配置文件必须禁用“自动提交”选项,并且必须定义大于零的默认提取大小。推荐值是例如10,可能是更高的数字提供更好的性能。为获取大小定义的数字, 定义驱动程序在请求更多之前保留在其内部缓冲区中的行数 来自后端的行。

【讨论】:

【参考方案2】:

或者,如果您的数据库不是那么大,您可以进行转储并在 .sql 生成的文件中进行搜索。

【讨论】:

这确实是我的首选方式,直接从命令行(所以不使用 sql> 提示符登录)。更多信息在这里:dev.mysql.com/doc/refman/8.0/en/mysqldump-sql-format.html 然后您可以使用 grep "search terms" ~/backup.sql 轻松搜索【参考方案3】:

如果您使用的是 MySQL Workbench,您可以通过右键单击要搜索的 DB Schema 来完成此操作,然后“搜索表数据...”。

在那里您可以选择“使用 REEXP 搜索”选项,然后像往常一样键入搜索文本。它将提供与您的特定文本匹配的数据库行。

您还需要选中“搜索所有类型的列”框。

【讨论】:

【参考方案4】:

在 MySQL Workbench 中,您可以使用 Table Data Search 功能。它可以跨多个表和/或多个数据库进行搜索。

【讨论】:

【参考方案5】:

如果你想纯粹在 MySQL 中完成,不需要任何编程语言的帮助,你可以使用这个:

## Table for storing resultant output

CREATE TABLE `temp_details` (
 `t_schema` varchar(45) NOT NULL,
 `t_table` varchar(45) NOT NULL,
 `t_field` varchar(45) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

## Procedure for search in all fields of all databases
DELIMITER $$
#Script to loop through all tables using Information_Schema
DROP PROCEDURE IF EXISTS get_table $$
CREATE PROCEDURE get_table(in_search varchar(50))
 READS SQL DATA
BEGIN
 DECLARE trunc_cmd VARCHAR(50);
 DECLARE search_string VARCHAR(250);

 DECLARE db,tbl,clmn CHAR(50);
 DECLARE done INT DEFAULT 0;
 DECLARE COUNTER INT;

 DECLARE table_cur CURSOR FOR
 SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM `',table_schema,'`.`',table_name,'` WHERE `', column_name,'` REGEXP ''',in_search,''';')
 ,table_schema,table_name,column_name
 FROM information_schema.COLUMNS
 WHERE TABLE_SCHEMA NOT IN ('information_schema','test','mysql');

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

 #Truncating table for refill the data for new search.
 PREPARE trunc_cmd FROM "TRUNCATE TABLE temp_details;";
 EXECUTE trunc_cmd ;

 OPEN table_cur;
 table_loop:LOOP
 FETCH table_cur INTO search_string,db,tbl,clmn;

 #Executing the search
 SET @search_string = search_string;
 SELECT search_string;
 PREPARE search_string FROM @search_string;
 EXECUTE search_string;


 SET COUNTER = @CNT_VALUE;
 SELECT COUNTER;

 IF COUNTER>0 THEN
 # Inserting required results from search to table
 INSERT INTO temp_details VALUES(db,tbl,clmn);
 END IF;

 IF done=1 THEN
 LEAVE table_loop;
 END IF;
 END LOOP;
 CLOSE table_cur;

 #Finally Show Results
 SELECT * FROM temp_details;
END $$
DELIMITER ;

来源:http://forge.mysql.com/tools/tool.php?id=232

【讨论】:

旧帖子,但我也在寻找类似的东西,但以前从未使用过 MySQL 函数或过程。 OP 正在寻找一些东西来搜索数据库中的所有表,但这个过程似乎搜索了所有数据库。它怎么能被限制在它所在的那个? 它的工作方式略有不同,因为它返回带有 search_string = query 的数组(在 LOOP 中查询)。但是当我评论行时: SELECT search_string;并选择计数器; ,然后它按预期工作并且程序返回正确的内容。它可能是由于数据库版本,我的是 MariaDB 10.1.31。

以上是关于mySQL 查询在数据库中的所有表中搜索字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在一个查询中从两个 mysql 表中选择数据

了解Mysql

MySQL使用总结

mysql怎样查询一个表中所有数据

mysql 表关联

Mysql优化方法