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

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

有可能做这样的事情吗?


当前回答

HeidiSQL是一个实用可靠的工具,专为使用流行的MySQL服务器的web开发人员设计。

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

其他回答

如果您不是在代码级别上使用它,只是想检查信息,您可以将整个数据库导出为SQL,然后在文本编辑器上搜索。

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

涉及的表包括SCHEMATA、tables和COLUMNS。有一些外键,这样您就可以在模式中准确地构建表的创建方式。

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

右键点击你的模式和“搜索表数据”,输入你的值,然后点击“开始搜索”。这是它。

即使下面的建议不应该被认为是最终的解决方案,你也可以通过这样做来实现目标:

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的存储过程。

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搜索文本。