是否可以搜索整个数据库表(行和列)以找出特定字符串。
我有一个名为 A 的数据库,其中包含大约 35 个表,我需要搜索名为“hello”的字符串,但我不知道该字符串保存在哪个表上。这可能吗?
使用 MySQL
我是一名 linux 管理员,我不熟悉数据库,如果您也能解释查询,那将非常有帮助。
小智 21
$ mysqldump -pPASSWORD database --extended=FALSE | grep pattern | less -S
Run Code Online (Sandbox Code Playgroud)
更多:http : //winashwin.wordpress.com/2012/08/28/mysql-search/
早在 2012 年 7 月我写了这篇文章
它使用表information_schema.columns来获取每个 CHAR、VARCHAR 和 TEXT 字段并执行文本REPLACE。
请查看我的旧链接并使用其范例进行搜索。
例如,这将为每个表中的每个文本列创建一个单独的 SELECT
SELECT
CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',QUOTE(col),',COUNT(1) FieldHasIt
FROM ',db,'.',tb,' WHERE \`',col,'\`=''',SearchString,''';') SearchSQL
FROM
(
SELECT table_schema db,table_name tb,column_name col FROM information_schema.columns
WHERE table_schema = 'mydb' AND
(column_type LIKE 'char(%' OR column_type LIKE 'varchar(%' OR column_type LIKE '%text')
) A,(SELECT 'Hello' SearchString) B;
Run Code Online (Sandbox Code Playgroud)
用它创建一个巨型 SQL 文本文件。然后,执行该巨型 SQL 脚本:
SQL="SELECT CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',"
SQL="${SQL} QUOTE(col),',COUNT(1) FieldHasIt FROM ',db,'.',tb,'"
SQL="${SQL} WHERE \`',col,'\`=''',SearchString,''';') SearchSQL FROM"
SQL="${SQL} (SELECT table_schema db,table_name tb,column_name col FROM"
SQL="${SQL} information_schema.columns WHERE table_schema='store_qa'"
SQL="${SQL} AND (column_type LIKE 'char(%' OR column_type LIKE 'varchar(%'"
SQL="${SQL} OR column_type LIKE '%text')) A,(SELECT 'Hello' SearchString) B;"
mysql -uroot -p... -ANe"${SQL}" > MegaSearch.sql
mysql -uroot -p... -AN < MegaSearch.sql > MegaSearchResults.txt
RESULTS_FOUND=`grep -c "1$" < MegaSearchResults.txt`
echo ${RESULTS_FOUND}
if [ ${RESULTS_FOUND} -gt 0 ] ; then grep "1$" < MegaSearchResults.txt ; fi
Run Code Online (Sandbox Code Playgroud)
输出会告诉您数据所在的数据库、表和列。
试一试 !!!。
编辑:
CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',QUOTE(col),',COUNT(1) FieldHasIt
FROM ',db,'.',tb,' WHERE \`',col,'\`=''',SearchString,''';')
Run Code Online (Sandbox Code Playgroud)
应该:为名称中有空格的表添加如下所示的两个反勾号。
db,'.`',tb,'`',' WHERE
Run Code Online (Sandbox Code Playgroud)
如果您是 Linux 管理员,您应该熟悉命令行,所以这个会很方便:
$ mysqldump -u root -proot --skip-extended-insert db_name | grep --color=auto -w foo
Run Code Online (Sandbox Code Playgroud)
将root/更改root为您的 mysql 凭据(或使用~/.my.cnf)、db_name数据库名称和foo搜索文本。参数--skip-extended-insertformysqldump将在单独的行中显示每个查询。参数--color=autoforgrep将突出显示您的字符串并-w匹配整个单词。
我专注于在Oracle数据库的 plsql 中实现的问题的简单模板解决方案,我希望在 MySql 上自定义它,简单地进行谷歌搜索。您所需要的只是研究 MySql 上的信息架构并替换一些表名和列。
在脚本中:
ALL_TAB_COLUMNS是一个包含所有表列的信息模式表
'VARCHAR2'、'NVARCHAR2'、'NCHAR'、'CHAR'引用 Oracle 中的字符串列类型,您必须将它们替换为 MySql
%hello%的等效类型名称是搜索关键字,将其替换为任何字符串。
结果将是一些或许多 sql 脚本(基于您的表列类型),运行它们将得到您的答案
此外,性能和时间消耗将是另一回事。
我希望这会有用
SELECT
'SELECT ' || ALL_TAB_COLUMNS.COLUMN_NAME || ' AS RESULT_FOUND, '
|| '''' || ALL_TAB_COLUMNS.TABLE_NAME ||''''|| ' AS TABLE_NAME, '
|| '''' || ALL_TAB_COLUMNS.COLUMN_NAME ||''''|| ' AS COLUMN_NAME '
|| 'FROM ' || ALL_TAB_COLUMNS.OWNER ||'.'||ALL_TAB_COLUMNS.TABLE_NAME
|| ' WHERE ' || ALL_TAB_COLUMNS.COLUMN_NAME || ' LIKE ''%hello%''' || ';'
FROM ALL_TAB_COLUMNS
WHERE
ALL_TAB_COLUMNS.OWNER = 'SCOTT'
AND
ALL_TAB_COLUMNS.DATA_TYPE IN ('VARCHAR2','NVARCHAR2','NCHAR','CHAR')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
161443 次 |
| 最近记录: |