我想在MySQL数据库的所有表中搜索给定字符串的所有字段,可能使用以下语法:
SELECT * FROM * WHERE * LIKE '%stuff%'
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
Dea*_*her 426
您可以执行SQLDump数据库(及其数据),然后搜索该文件.
小智 196
如果您安装了phpMyAdmin,请使用其"搜索"功能.
我在多达250个表/ 10GB数据库(在快速服务器上)上使用它,响应时间简直太惊人了.
Mil*_*ous 78
您可以查看information_schema架构.它包含表中所有表和所有字段的列表.然后,您可以使用从此表中获取的信息运行查询.
涉及的表格是SCHEMATA,TABLES和COLUMNS.有外键,您可以准确地建立在模式中创建表的方式.
Oli*_*ier 43
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;
}
Run Code Online (Sandbox Code Playgroud)
chx*_*chx 15
十二年过去了,没有人回答以下问题:
我想在 MySQL 数据库的所有表的所有字段中搜索给定的字符串
答案包括 GUI、模糊的想法、语法错误、需要表名或前缀的过程以及各种扭曲。这是一个实际的、有效的、经过测试的、易于使用的答案,它建立在多个先前答案的基础上,但也将主键添加到结果中。
DROP PROCEDURE IF EXISTS findAll;
DELIMITER $$
CREATE PROCEDURE findAll( IN `search` TEXT )
BEGIN
SET SESSION group_concat_max_len := @@max_allowed_packet;
SELECT GROUP_CONCAT(
"SELECT '", c1.TABLE_NAME, "' AS `table`, '", c1.COLUMN_NAME, "' AS `column`, ",
"CONCAT_WS(',', ", (SELECT GROUP_CONCAT(c2.column_name) FROM `information_schema`.`columns` c2 WHERE c1.TABLE_SCHEMA=c2.TABLE_SCHEMA AND c1.TABLE_NAME=c2.TABLE_NAME AND c2.COLUMN_KEY='PRI') ,") AS pri,",
c1.COLUMN_NAME, " AS value FROM ", c1.TABLE_NAME,
" WHERE `",c1.COLUMN_NAME,"` LIKE '%", search, "%'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM information_schema.columns c1
WHERE c1.TABLE_SCHEMA = DATABASE();
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
就是这样。你现在可以做CALL findAll('foobar');
除非不是。你会遇到两个问题:
将以下两行添加到/etc/mysql/mysql.conf.d/mysqld.cnf您cnf所在的位置或将它们保存在单独的文件中并复制到conf.d目录中。
thread_stack = 2M
table_definition_cache = 5000
Run Code Online (Sandbox Code Playgroud)
是的,显然这不应该在生产中运行,因为它不安全并且会降低你的性能。
ard*_*779 13
这是我所知道的简单方法。在 PHPMyAdmin 中选择您的数据库,然后转到“搜索”选项卡并写下您要查找的内容以及要搜索的位置。如果您要从所有表格中搜索单词,请选择所有表格。然后“GO”并查看结果。
Jay*_*zzo 12
如果你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%'
)
;
Run Code Online (Sandbox Code Playgroud)
.
# =================
# 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')
;
Run Code Online (Sandbox Code Playgroud)
.
# =================
# 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%'
;
Run Code Online (Sandbox Code Playgroud)
结果应如下所示:
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';
Run Code Online (Sandbox Code Playgroud)
在MySQL版本上测试:5.6.23
警告:不要运行如下:
- 您担心导致表锁(密切关注您的客户端连接)
你不确定自己在做什么.
你试图激怒你的DBA.(你的办公桌里的人可能会很快.)
干杯,周杰伦; - ]
我也做了我自己的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++;
}
}
Run Code Online (Sandbox Code Playgroud)
运行此脚本可能会输出如下内容:
---------------------------------------------------
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
Run Code Online (Sandbox Code Playgroud)
MySQL工作台
以下是一些说明。
下载并安装 MSQL Workbench。
https://www.mysql.com/products/workbench/
安装时,可能需要您安装 Visual Studio C++ Redistributable。你可以在这里得到它:
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
x64:vc_redist.x64.exe(适用于 64 位 Windows)
当您打开 MySQL Workbench 时,您必须输入主机名、用户名和密码。
侧面菜单栏上有一个 Schemas 选项卡,单击 Schemas 选项卡,然后双击数据库选择要搜索的数据库。
然后进入菜单“数据库 - 搜索数据”,输入您要搜索的文本,单击“开始搜索”。
海蒂SQL
下载并安装 HeidiSql https://www.heidisql.com/download.php
输入您的主机名、用户名和密码。
按 Ctrl+Shift+F 搜索文本。
小智 6
这是检索所有列和表的最简单查询
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
Run Code Online (Sandbox Code Playgroud)
可以通过phpMyAdmin中的"搜索"选项卡搜索所有表或名称中具有特定字符串的表.
有好的查询......\^.^ /
小智 6
这是我的解决方案
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;
Run Code Online (Sandbox Code Playgroud)
虽然这个问题很老,但如果您使用的是 mysql workbench 6.3,这里是如何做到的。(很可能它也适用于其他版本)
右键单击您的架构和“搜索表数据”,输入您的值并点击“开始搜索”。就是这样。
我使用HeidiSQL是一个有用和可靠的工具,专为使用流行的MySQL服务器的Web开发人员.
在HeidiSQL中,你可以按shift + ctrl + f,你可以在所有表格中找到服务器上的文本.这个选项非常有用.
| 归档时间: |
|
| 查看次数: |
411668 次 |
| 最近记录: |