从MySQL数据库的每个表中搜索所有字段

我想从MySQL数据库的所有表中搜索给定字符串的所有字段,可能使用的语法如下:

SELECT * FROM * WHERE * LIKE '%stuff%' 

有没有可能做这样的事情?

您可以查看information_schema模式。 它有一个表中的所有表和所有字段的列表。 然后,您可以使用您从此表获得的信息运行查询。

涉及的表是SCHEMATA,表和列。 有外键,这样你就可以建立在一个模式中如何创建表。

你可以做一个SQLDump的数据库(及其数据),然后搜索该文件。

如果您安装了phpMyAdmin,请使用其“搜索”功能。

  • 选择你的数据库
  • 确保你有一个数据库选择(即不是一个表,否则你会得到一个完全不同的搜索对话框)
  • 点击“搜索”标签
  • 选择你想要的搜索字词
  • 选择要搜索的表格

我已经在多达250个表/ 10GB数据库(在一个快速服务器上)上使用了这个功能,响应时间也是惊人的。

您可以使用此项目: http : //code.google.com/p/anywhereindb

这将搜索所有表中的所有数据。

 function searchAllDB($search){ global $mysqli; $out = ""; $sql = "show tables"; $rs = $mysqli->query($sql); if($rs->num_rows > 0){ while($r = $rs->fetch_array()){ $table = $r[0]; $out .= $table.";"; $sql_search = "select * from ".$table." where "; $sql_search_fields = Array(); $sql2 = "SHOW COLUMNS FROM ".$table; $rs2 = $mysqli->query($sql2); if($rs2->num_rows > 0){ while($r2 = $rs2->fetch_array()){ $colum = $r2[0]; $sql_search_fields[] = $colum." like('%".$search."%')"; } $rs2->close(); } $sql_search .= implode(" OR ", $sql_search_fields); $rs3 = $mysqli->query($sql_search); $out .= $rs3->num_rows."\n"; if($rs3->num_rows > 0){ $rs3->close(); } } $rs->close(); } return $out; } 

我也做了我自己的mysql爬虫搜索一些wordpress的配置,无法在界面和数据库中找到它,数据库转储太重,难以理解。 我必须说,我现在离不开它。

它的工作方式类似@Olivier,但它管理异国情调的数据库/表名,并且是LIKE-joker安全的。

 <?php $database = 'database'; $criteria = '*iemblo'; // you can use * and ? as jokers $dbh = new PDO("mysql:host=127.0.0.1;dbname={$database};charset=utf8", 'root', ''); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $tables = $dbh->query("SHOW TABLES"); while (($table = $tables->fetch(PDO::FETCH_NUM)) !== false) { $fields = $dbh->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?"); $fields->execute(array ($database, $table[0])); $ors = array (); while (($field = $fields->fetch(PDO::FETCH_NUM)) !== false) { $ors[] = str_replace("`", "``", $field[0]) . " LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(:search, '\\\\', '\\\\\\\\'), '%', '\\%'), '_', '\\_'), '*', '%'), '?', '_')"; } $request = 'SELECT * FROM '; $request .= str_replace("`", "``", $table[0]); $request .= ' WHERE '; $request .= implode(' OR ', $ors); $rows = $dbh->prepare($request); $rows->execute(array ('search' => $criteria)); $count = $rows->rowCount(); if ($count == 0) { continue; } $str = "Table '{$table[0]}' contains {$count} rows matching '{$criteria}'."; echo str_repeat('-', strlen($str)), PHP_EOL; echo $str, PHP_EOL; echo str_repeat('-', strlen($str)), PHP_EOL; $counter = 1; while (($row = $rows->fetch(PDO::FETCH_ASSOC)) !== false) { $col = 0; $title = "Row #{$counter}:"; echo $title; foreach ($row as $column => $value) { echo (($col++ > 0) ? str_repeat(' ', strlen($title) + 1) : ' '), $column, ': ', trim(preg_replace('!\s+!', ' ', str_replace(array ("\r", "\t", "\n"), array ("", "", " "), $value))), PHP_EOL; } echo PHP_EOL; $counter++; } } 

运行这个脚本可以输出如下内容:

 --------------------------------------------------- Table 'customers' contains 1 rows matching '*iemblo'. --------------------------------------------------- Row #1: email_client: my@email.com numero_client_compta: C05135 nom_client: Tiemblo adresse_facturation_1: 151, My Street adresse_facturation_2: ville_facturation: Nantes code_postal_facturation: 44300 pays_facturation: FR numero_tva_client: zone_geographique: UE prenom_client: Alain commentaires: nom_societe: email_facturation: my@email.com 

这是检索所有列和表的最简单的查询

 SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE' 

所有的表格或名称中具有特定字符串的表格都可以通过phpMyAdmin中的“搜索”选项卡进行搜索。

有好的查询… \ ^。^ /

如果您正在避免像鼠疫这样的stored procedures ,或者由于权限,或者由于其他各种原因而无法执行mysql_dump

我会建议像这样的三步法:

1)在这个查询构建一堆查询作为结果集。

 # ================= # VAR/CHAR SEARCH # ================= # BE ADVISED USE ANY OF THESE WITH CAUTION # DON'T RUN ON YOUR PRODUCTION SERVER # ** USE AN ALTERNATE BACKUP ** SELECT CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE ', A.COLUMN_NAME, ' LIKE \'%stuff%\';') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' AND ( A.DATA_TYPE LIKE '%text%' OR A.DATA_TYPE LIKE '%char%' ) ; 

 # ================= # NUMBER SEARCH # ================= # BE ADVISED USE WITH CAUTION SELECT CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE ', A.COLUMN_NAME, ' IN (\'%1234567890%\');') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' AND A.DATA_TYPE IN ('bigint','int','smallint','tinyint','decimal','double') ; 

 # ================= # BLOB SEARCH # ================= # BE ADVISED THIS IS CAN END HORRIFICALLY IF YOU DONT KNOW WHAT YOU ARE DOING # YOU SHOULD KNOW IF YOU HAVE FULL TEXT INDEX ON OR NOT # MISUSE AND YOU COULD CRASH A LARGE SERVER SELECT CONCAT('SELECT CONVERT(',A.COLUMN_NAME, ' USING utf8) FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE CONVERT(',A.COLUMN_NAME, ' USING utf8) IN (\'%someText%\');') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' AND A.DATA_TYPE LIKE '%blob%' ; 

结果应该是这样的:

将这些结果复制到另一个查询窗口

2)然后您可以Right Click并使用Copy Row (tab separated)

在这里输入图像描述

3)粘贴结果在一个新的查询窗口,并运行到你的心中的内容。

详细信息:我排除了在工作台中通常不会看到的系统架构,除非您有选中Show Metadata and Internal Schemas选项。

我这样做是为了提供一种快速ANALYZE整个HOST或DB的方法,或者运行OPTIMIZE语句来支持性能改进。

我相信你可以采取不同的方式来做这件事,但是这对我有用:

 -- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEM SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'; -- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO OPTIMIZE THEM SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'; 

测试MySQL版本:5.6.23

警告:不要运行这个如果:

  1. 你担心造成表锁(注意你的客户连接)
  2. 你不确定你在做什么。

  3. 你正试图激怒你DBA。 (你可以在办公桌前快速地找人。)

干杯,周杰伦; – ]

这是我的解决方案

 DROP PROCEDURE IF EXISTS findAll; CREATE PROCEDURE `findAll`( IN `tableName` VARCHAR( 28 ) , IN `search` TEXT ) BEGIN DECLARE finished INT DEFAULT FALSE ; DECLARE columnName VARCHAR ( 28 ) ; DECLARE stmtFields TEXT ; DECLARE columnNames CURSOR FOR SELECT DISTINCT `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE `TABLE_NAME` = tableName ORDER BY `ORDINAL_POSITION` ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE; SET stmtFields = '' ; OPEN columnNames ; readColumns: LOOP FETCH columnNames INTO columnName ; IF finished THEN LEAVE readColumns ; END IF; SET stmtFields = CONCAT( stmtFields , IF ( LENGTH( stmtFields ) > 0 , ' OR' , '' ) , ' `', tableName ,'`.`' , columnName , '` REGEXP "' , search , '"' ) ; END LOOP; SET @stmtQuery := CONCAT ( 'SELECT * FROM `' , tableName , '` WHERE ' , stmtFields ) ; PREPARE stmt FROM @stmtQuery ; EXECUTE stmt ; CLOSE columnNames ; END; 

你可以使用

 SHOW TABLES; 

然后获取这些表中的列(循环)

 SHOW COLUMNS FROM table; 

然后用这个信息创建许多许多查询,你也可以在需要的时候使用UNION。

但是这对数据库来说是非常重的。 特别是如果你正在做一个LIKE搜索。

转储SQL文件可能是最快和最快的。 无论如何还发现了另一个问题。

使用MySQL Workbench,可以很容易地选择几个表并在DB的所有表中运行搜索文本;-)

我使用HeidiSQL是一个有用和可靠的工具,为使用流行的MySQL服务器的Web开发人员设计。

在HeidiSQL中,你可以按shift + ctrl + f,你可以在服务器上的所有表格中找到文本。 这个选项非常有用。

虽然这个问题很老,但是如果你使用的是mysql workbench 6.3,你可以这样做。 (很可能它也适用于其他版本)

右键点击您的架构和“搜索表格数据”,输入您的值,然后点击“开始搜索”。 而已。

这个解决方案
a)只有MySQL,没有其他语言需要,和
b)返回SQL结果,准备处理!

 #Search multiple database tables and/or columns #Version 0.1 - JK 2014-01 #USAGE: 1. set the search term @search, 2. set the scope by adapting the WHERE clause of the `information_schema`.`columns` query #NOTE: This is a usage example and might be advanced by setting the scope through a variable, putting it all in a function, and so on... #define the search term here (using rules for the LIKE command, eg % as a wildcard) SET @search = '%needle%'; #settings SET SESSION group_concat_max_len := @@max_allowed_packet; #ini variable SET @sql = NULL; #query for prepared statement SELECT GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '",@search,"'" SEPARATOR "\nUNION\n") AS col INTO @sql FROM `information_schema`.`columns` WHERE TABLE_NAME IN ( SELECT TABLE_NAME FROM `information_schema`.`columns` WHERE TABLE_SCHEMA IN ("my_database") && TABLE_NAME IN ("my_table1", "my_table2") || TABLE_NAME LIKE "my_prefix_%" ); #prepare and execute the statement PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

我修改了Olivier的PHP答案,以便:

  • 打印出找到字符串的结果
  • 忽略没有结果的表格
  • 如果列名与搜索输入匹配,也会显示输出
  • 显示结果的总数

     function searchAllDB($search){ global $mysqli; $out = ""; $total = 0; $sql = "SHOW TABLES"; $rs = $mysqli->query($sql); if($rs->num_rows > 0){ while($r = $rs->fetch_array()){ $table = $r[0]; $sql_search = "select * from ".$table." where "; $sql_search_fields = Array(); $sql2 = "SHOW COLUMNS FROM ".$table; $rs2 = $mysqli->query($sql2); if($rs2->num_rows > 0){ while($r2 = $rs2->fetch_array()){ $colum = $r2[0]; $sql_search_fields[] = $colum." like('%".$search."%')"; if(strpos($colum,$search)) { echo "FIELD NAME: ".$colum."\n"; } } $rs2->close(); } $sql_search .= implode(" OR ", $sql_search_fields); $rs3 = $mysqli->query($sql_search); if($rs3 && $rs3->num_rows > 0) { $out .= $table.": ".$rs3->num_rows."\n"; if($rs3->num_rows > 0){ $total += $rs3->num_rows; $out.= print_r($rs3->fetch_all(),1); $rs3->close(); } } } $out .= "\n\nTotal results:".$total; $rs->close(); } return $out; } 

我用联合串查询。 不知道这是否是最有效的方式,但它的工作原理。

 SELECT * FROM table1 WHERE name LIKE '%Bob%' Union SELCET * FROM table2 WHERE name LIKE '%Bob%'; 

导出整个数据库并在.sql文件中搜索。

有一个很好的图书馆阅读所有表, ridona

 $database = new ridona\Database('mysql:dbname=database_name;host=127.0.0.1', 'db_user','db_pass'); foreach ($database->tables()->by_entire() as $row) { ....do }