我想从一个MySQL数据库的所有表的所有字段搜索一个给定的字符串,可能使用语法为:
SELECT * FROM * WHERE * LIKE '%stuff%'
有可能做这样的事情吗?
我想从一个MySQL数据库的所有表的所有字段搜索一个给定的字符串,可能使用语法为:
SELECT * FROM * WHERE * LIKE '%stuff%'
有可能做这样的事情吗?
当前回答
您可以查看information_schema模式。它包含所有表和表中所有字段的列表。然后,您可以使用从该表中获得的信息运行查询。
涉及的表包括SCHEMATA、tables和COLUMNS。有一些外键,这样您就可以在模式中准确地构建表的创建方式。
其他回答
您可以对数据库(及其数据)执行SQLDump,然后搜索该文件。
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选项卡,然后双击数据库以选择要搜索的数据库。
然后转到菜单数据库-搜索数据,并输入你要搜索的文本,单击开始搜索。
海蒂SQLl
下载并安装HeidiSql https://www.heidisql.com/download.php
输入主机名、用户名和密码。
按Ctrl+Shift+F搜索文本。
即使下面的建议不应该被认为是最终的解决方案,你也可以通过这样做来实现目标:
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和limit 1000000并不总是必需的,这将取决于您的服务器/IDE配置。以防我加进去。 执行此命令后,您将得到一个3列响应:[table_name], [column_name], [matches] 列'matches'是给定表/列中出现的次数。 这个查询非常快。
免责声明:它只对个人使用有用,换句话说,请不要在生产系统中使用它,因为考虑到搜索参数与其他字符串连接,它对SQL注入攻击很敏感。 如果你想创建一个prod. ready函数,那么你需要创建一个带有LOOP的存储过程。
这是我的解决方案
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;
HeidiSQL是一个实用可靠的工具,专为使用流行的MySQL服务器的web开发人员设计。
在HeidiSQL中,您可以按shift + ctrl + f,您可以在服务器上的所有表中找到文本。这个选项非常有用。