SELECT * FROM * WHERE * LIKE '%stuff%'
是否可以做这样的事情?
#1 楼
您可以查看information_schema
模式。它具有所有表和表中所有字段的列表。然后,您可以使用从此表中获得的信息来运行查询。涉及的表是SCHEMATA,TABLES和COLUMNS。有一些外键,使您可以准确地建立在模式中创建表的方式。
评论
这不是我想要的答案,但我必须接受事实。 :D谢谢你
– RSilva
09年3月12日在17:49
这是正确的,但@Dan Rather的回答也有所帮助,因为我正在浏览的数据库设置不明确,仅通过查看就无法确定列名或表的确切含义。
– DrCord
2014年1月1日19:14
information_schema是一个数据库,而不是一个表。在information_schema中对在哪个表中进行搜索的一些澄清会很好!
–CaptSaltyJack
2014年8月7日在21:20
MySql没有提供搜索所有表的方式对我来说很有趣。似乎是一个非常基本的选择
–科洛布峡谷
16-09-21在21:44
@KolobCanyon MySQL确实提供了一个通过从db_name像'pattern'的SHOW TABLES进行操作的选项
–vladkras
16-11-20在9:52
#2 楼
您可以对数据库(及其数据)执行SQLDump
,然后搜索该文件。评论
不要忘记,您可以对MySQLdump使用--extended-insert = FALSE标志,以使输出更具可读性。
– Benubird
13年1月24日在10:30
如果您想像我一样想知道铅笔评论是关于什么的:snopes.com/business/genius/spacepen.asp
–詹森·斯威特(Jason Swett)
2014年8月1日在22:11
这是搜索整个数据库的“标准”(事实上)方法。我喜欢mysqldump -T,它在指定目录的每个表中创建两个文件。然后,我在目录中使用grep
–乔尔·梅隆(Joel Mellon)
15年1月14日在17:37
当您拥有大型SQL或归档文件时-您可以直接在服务器上的MC中打开它,然后查看->搜索
– Vitaly Zdanevich
2015年8月11日下午13:20
不错的建议!但是,如果数据库转储文件确实很大(我现在所处的状况:)),它将无法工作。
– Boban
17年5月31日在12:32
#3 楼
如果您已安装phpMyAdmin,请使用其“搜索”功能。选择数据库
请确保您确实选择了一个数据库(即不是表,否则将得到)完全不同的搜索对话框)
单击“搜索”选项卡
选择所需的搜索词
选择要搜索的表
我已在250个以上使用过表/ 10GB数据库(在快速服务器上),响应时间简直令人惊讶。
评论
我们的数据库之一是92.7Gb,该选项很好用。很好的解决方案
–整rick
2013年11月25日14:59
我总是忘记了phpMyAdmin可以做什么。这是一个很棒的工具!
–维尔
2014年1月8日在20:07
非常快,对我的Magento数据库有帮助。在几秒钟内找到了我要查找的数据以及所有其他引用它的表的字段。
–mtrueblood
14年7月29日在20:08
MySQL Workbench也具有此功能:“数据库>>搜索表数据...”
–马特·威尔基
17年2月23日在17:09
真好!现在如何替换phpmyadmin中搜索的字符串?
– Pathros
18年5月10日在21:58
#4 楼
PHP函数: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()){
$column = $r2[0];
$sql_search_fields[] = $column." 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;
}
评论
对于那些可能不知道的人,这是pho。
–风格
19/11/22在5:41
像这样设置$ mysqli:$ mysqli = new mysqli('localhost','root','hunter2','my_database');
–亚当·泰勒(Adam Taylor)
5月8日19:32
另外,我强烈建议将“ $ colum”替换为“`$ colum`”,以便保留字的字段不会引起问题
–亚当·泰勒(Adam Taylor)
5月8日19:32
#5 楼
如果您像瘟疫一样躲避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或数据库,或者运行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
警告:请勿运行以下命令:
您担心引起表锁(请注意客户端连接)
您不确定自己要做什么在做。
您想激怒您的DBA。 (您可能很快就会在办公桌旁坐着别人。)
干杯,周杰伦;-]
评论
绝对不是您想在实时数据库上运行的东西,但对某些调试任务很有帮助。但是,如果列类型不与字符串进行比较,则此操作将失败。即一个int列。
– Michael Thessel
17年11月9日,0:44
很好,我添加了三种选择来搜索Blob,Chars或Int。这只是一个概括,应始终谨慎使用。就像您提到的那样,从未在PRODUCTION上执行过,这通常是使您被解雇的原因:“在Internet上找到脚本并且不理解它们,但仍在运行它们”,但是,这就是人们学习困难的方式。
–JayRizzo
17年11月14日在0:20
#6 楼
这就是我所知道的简单方法。在PHPMyAdmin中选择数据库,然后转到“搜索”选项卡,写下要查找的内容以及将在何处搜索。如果要搜索所有表中的单词,请选择所有表。然后“转到”并查看结果。
#7 楼
我还用自己的mysql搜寻器搜索了一些wordpress配置,在界面和数据库中都找不到它,并且数据库转储太重且难以读取。我必须说我现在离不开它。它的工作原理与@Olivier中的类似,但它管理外来的数据库/表名,并且很安全。
<?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
评论
我收到此错误:致命错误:消息为'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法有错误;检查与您的MySQL服务器版本对应的手册以获取正确的语法,以在'key LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('180well *','\\','\\\\')),'% ','在第1行'
–LLBBL
2015年9月7日于20:55
#8 楼
使用MySQL Workbench可以很容易地选择几个表并在数据库的所有这些表中运行文本搜索;-)评论
谢谢!第一次使用工作台。相当直观,它使我指向了需要的桌子,并且可以从那里找到它。
– joshmiller
19-09-25在13:24
#9 楼
这是检索所有列和表的最简单查询。可以通过phpMyAdmin中的“搜索”选项卡搜索所有表或名称中具有特定字符串的表。查询很好... \ ^。^ /
评论
值又如何呢?
–themhz
13年7月7日在18:27
#10 楼
尽管这个问题很旧,但是如果您正在使用mysql workbench 6.3,则可以通过以下方法来解决。 (很可能也适用于其他版本)右键单击您的架构和“搜索表数据”,输入值,然后单击“开始搜索”。就是这样。
#11 楼
这是我为此的解决方案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;
评论
当我运行CALL findAll('tbl_test','abb')时,我错过了此错误:#1267-操作'='的归类(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)的非法混合可以解决吗?谢谢!
–达沃兹
2012年5月25日6:00
#12 楼
我正在使用HeidiSQL是一个有用且可靠的工具,专为使用流行的MySQL服务器的Web开发人员而设计。在HeidiSQL中,您可以按shift + ctrl + f,并且可以在服务器上的所有表中找到文本。此选项非常有用。
评论
+1似乎可以很好地完成工作,并且是一种有用的工具,可以节省其他一些答案中涉及的麻烦。还值得注意的是,它允许您选择要搜索的数据库。
–史蒂夫·钱伯斯(Steve Chambers)
16年8月5日在9:13
#13 楼
您可以使用SHOW TABLES;
,然后使用
SHOW COLUMNS FROM table;
获取这些表中的列(循环)然后使用该信息创建许多查询,如果需要,也可以使用UNION。
但这在数据库上非常繁重。特别是在进行LIKE搜索时。
评论
从
–vladkras
16-11-20在9:49
#14 楼
此解决方案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, e.g % 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;
评论
对于这类解决方案,通常将它们添加到phpfiddler会很好,这样人们就可以查看甚至评论您的解决方案。 :)
–pal4life
14年6月19日在20:16
我收到错误#1243-当我在Phpmyadmin中运行查询以在整个数据库中进行搜索时,给EXECUTE的未知的预处理语句处理程序(stmt)被赋予了EXECUTE
– Vicky Dev
16年5月3日在6:24
@VickyDev我知道您提出问题已经一年多了。抱歉。不过:我认为您的脚本中有些其他问题,因为在EXECUTE上方的行中声明了stmt。您正在使用哪个版本的MySQL?
–琼斯
17年8月26日在13:07
#15 楼
我对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;
}
#16 楼
MySQL Workbench这里有一些说明。
下载并安装MSQL Workbench。
https://www.mysql.com/products/workbench/
安装时,可能需要您安装Visual Studio C ++可再发行组件。您可以在此处获取它:
https://support.microsoft.com/zh-cn/help/2977003/the-latest-supported-visual-c-downloads
x64:vc_redist.x64.exe (适用于64位Windows)
打开MySQL Workbench时,必须输入主机名,用户名和密码。
侧面菜单栏上有一个Schemas选项卡,单击Schemas选项卡,然后双击数据库以选择要搜索的数据库。
然后转到菜单数据库-搜索数据,然后输入要搜索的文本,然后单击开始搜索。
HeidiSql
下载并安装HeidiSql
https://www.heidisql.com/download.php
输入您的主机名,用户名和密码。
按Ctrl + Shift + F到搜索文本。
评论
感谢您分享这个很棒的工具:HeidiSql
–Peacefull
8月19日8:21
#17 楼
我以先前的答案为基础,并进行了一些填充,以便能够方便地连接所有输出:SELECT
CONCAT('SELECT ''',A.TABLE_NAME, '-' ,A.COLUMN_NAME,''' FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' LIKE \'%Value%\' UNION')
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'
UNION SELECT 'SELECT '''
-- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead
首先运行此代码,然后粘贴并运行结果(不编辑),它将显示所有使用该值的表名和列。
评论
对列值进行四次检查不是最简单的方法。您可以/不应该在A.TABLE_SCHEMA IN(“ mysql”,“ innodb”,“ performance_schema”,“ information_schema”)中执行,甚至执行它,检查使用的模式,并在其中设置使用的模式,而不是排除所有其他。
–克莱普图斯
18年8月10日在10:35
#18 楼
我有这个工作。您只需要更改变量$query ="SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`='" . $_SESSION['db'] . "' AND `table_name`='" . $table . "' ";
$stmt = $dbh->prepare($query);
$stmt->execute();
$columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
$query="SELECT name FROM `" . $database . "`.`" . $table . "` WHERE ( ";
foreach ( $columns as $column ) {
$query .=" CONVERT( `" . $column['column_name'] . "` USING utf8 ) LIKE '%" . $search . "%' OR ";
}
$query = substr($query, 0, -3);
$query .= ")";
echo $query . "<br>";
$stmt=$dbh->prepare($query);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r ($results );
echo "</pre>";
#19 楼
我已经使用HeidiSQL做到了这一点。不容易找到,但是通过按Ctrl + Shift + F可以显示“表格工具”对话框。然后选择要搜索的内容(将整个数据库存储到单个表中)并输入“要查找的文本”值,然后单击“查找”。我发现它出奇的快(不到一分钟就达到了870MiB db)
#20 楼
我用Union将查询串在一起。不知道这是否是最有效的方法,但是它有效。SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
评论
这个答案的问题是表的数量可变且未知
–克莱普图斯
18年8月10日在10:38
#21 楼
有一个很好的库,可以读取所有表,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
}
#22 楼
我不知道这是否仅是最新版本,但是右键单击Tables
窗格中的Navigator
选项会弹出一个名为Search Table Data
的选项。这将打开一个搜索框,在其中填写搜索字符串并单击搜索。您确实需要在左窗格中选择要在其中搜索的表。但是,如果您按住shift键并一次选择10张表,则MySql可以处理该问题并在几秒钟内返回结果。
对于任何寻求更好选择的人! :)
评论
您正在使用什么应用程序进行所有这些操作?
–乔恩·施耐德(Jon Schneider)
19年7月10日在20:50
他正在使用导航器应用程序。
–达米尔·奥莱哈尔(Damir Olejar)
2月21日18:01
#23 楼
如果23个答案不够用,这里还有2个...根据数据库的结构和内容,您可能会发现它们实际上是一种快速而简单的解决方案。对于Shell一线壳的粉丝来说,一长串(实际上在两行上使用变量):
cmd='mysql -u Username -pYour_Password -D Your_Database' # <-- Adapt this
$cmd -s -e 'SHOW TABLES' | while read table; do echo "=== $table ==="; $cmd -B -s -e "SELECT * FROM $table" | grep 'Your_Search'; done
或在多行上使其更具可读性:
$cmd -s -e 'SHOW TABLES' \
| while read table; do
echo "=== $table ===";
$cmd -B -s -e "SELECT * FROM $table" \
| grep 'Your_Search';
done
-s
(--silent
)用于禁止显示列名标头-B
(--batch
)转义诸如换行符之类的特殊字符,因此当使用grep
时我们会获得完整记录。对于Perl爱好者,这将使您使用正则表达式:
# perl -MDBI -le '($db,$u,$p)=@ARGV; $dbh=DBI->connect("dbi:mysql:dbname=$db",$u,$p); foreach $table ($dbh->tables()) {print "$table\n"; foreach $r ($dbh->selectall_array("SELECT * FROM $table")) {$_=join("\t", @$r); print $_ if (/Your_Regex/);}}' Your_Database Username Your_Password
在“真正的” Perl脚本中可能是这样的:
#!/usr/bin/perl
use strict;
use open qw(:std :utf8);
use DBI;
my $db_host = 'localhost';
my $db = 'Your_Database';
my $db_user = 'Username';
my $db_pass = 'Your_Password';
my $search = qr/Your_regex_Search/;
# https://metacpan.org/pod/DBD::mysql
my $dbh = DBI->connect( "dbi:mysql:dbname=$db;host=$db_host", $db_user, $db_pass,
{ mysql_enable_utf8mb4 => 1 }
) or die "Can't connect: $DBI::errstr\n";
foreach my $table ( $dbh->tables() ) {
my $sth = $dbh->prepare("SELECT * FROM $table")
or die "Can't prepare: ", $dbh->errstr;
$sth->execute
or die "Can't execute: ", $sth->errstr;
my @results;
while (my @row = $sth->fetchrow()) {
local $_ = join("\t", @row);
if ( /$search/ ) {
push @results, $_;
}
}
$sth->finish;
next unless @results;
print "*** TABLE $table :\n",
join("\n---------------\n", @results),
"\n" . "=" x 20 . "\n";
}
$dbh->disconnect;
#24 楼
即使不应将以下建议视为最终解决方案,也可以通过执行以下操作来实现目标:SET SESSION group_concat_max_len = 1000000;
SET @search = 'Text_To_Search';
DROP table IF EXISTS table1;
CREATE TEMPORARY TABLE table1 AS
(SELECT
CONCAT('SELECT \'',TABLE_NAME,'\' as \'table_name\',\'',COLUMN_NAME,'\' as \'column_name\',CONVERT(count(*),char) as \'matches\' FROM `',
TABLE_NAME,'` where `',COLUMN_NAME,'` like \'%',@search,'%\' UNION ') as 'query'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' limit 1000000);
set @query = (SELECT GROUP_CONCAT(t1.`query` SEPARATOR '') as 'final_query' from table1 t1 limit 1);
set @query = (SELECT SUBSTRING(@query, 1, length(@query) - 7));
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请记住:
选项:并非总是需要group_concat_max_len和限制1000000,这取决于您的服务器/ IDE配置。以防万一我添加了它们。
执行此操作后,您将获得3列响应:[table_name],[column_name],[matches]
'matches'列是给定表/列中出现的次数。
此查询非常快。
免责声明:仅当用于个人用途时才有用,换句话说,请勿在生产系统中使用它,因为鉴于search参数与其他字符串连接在一起,它对SQL Injection攻击很敏感。
如果需要创建一个产品。准备功能,那么您将需要使用LOOP创建存储过程。
评论
该博客可能会有所帮助:winashwin.wordpress.com/2012/08/28/mysql-search