在mysql数据库中搜索所有出现的字符串[重复]
Posted
技术标签:
【中文标题】在mysql数据库中搜索所有出现的字符串[重复]【英文标题】:Search for all occurrences of a string in a mysql database [duplicate] 【发布时间】:2010-10-08 10:15:39 【问题描述】:我试图弄清楚如何在数据库中找到所有出现的 url。我想搜索所有表格和所有字段。但我不知道从哪里开始,或者是否有可能。
【问题讨论】:
我需要这个的一个例子是当我需要在一个我不熟悉的数据库上进行全局查找和替换时,例如将 WordPress 站点迁移到其他域时,我需要替换所有出现的旧域名。 参考这个:winashwin.wordpress.com/2012/08/28/mysql-search 将所有表格导出为文本,然后 Ctrl+F :) 【参考方案1】:不是一个优雅的解决方案,但您可以使用嵌套循环结构来实现它
// select tables from database and store in an array
// loop through the array
foreach table in database
// select columns in the table and store in an array
// loop through the array
foreach column in table
// select * from table where column = url
您可以通过在构建列数组时检查哪些列包含字符串以及将每个表的所有列组合在一个巨大的逗号分隔的 WHERE 子句中来加快此过程。
【讨论】:
where column like '%url%'
如果您不能保证该字段只是 URL。【参考方案2】:
Scott 举了一个很好的例子来说明如何做到这一点,但问题是你为什么要这样做?如果您需要对特定字符串进行查找和替换,也可以尝试对数据库进行 mysqldump,在编辑器中进行查找和替换,然后重新加载数据库。
也许如果你提供了一些关于你想要达到的目标的背景,其他人可能会提供更好的答案。
【讨论】:
在某些情况下这不起作用,或者可能不是一个好主意。示例:在用户提交的 html 代码中查询数据库中包含某个字符串的所有行,然后将这些行加载到 HTML 解析器中,对数据进行操作,然后重新保存它们。【参考方案3】:一个简单的解决方案是这样做:
mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename | grep -i "<search string>"
【讨论】:
@SchlaWeiner 只是转储数据;你不知道行模式或表。 adminer.org 在所有表(给定指定的数据库)中查找文本方面做得很好。 如果你赶时间的话,这是有道理的...... @ashes999 inless
或 vim
您可以搜索下一个/上一个 DDL 语句的出现以查找表名。至于行,它会找到行。只需查看匹配的文本行中的值和/或主键。
+1 我试图找出一个 sql 块来传递所有表,然后搜索我的字符串的所有列,然后对那个特定的行进行更新.... 什么乱七八糟!这一如既往的简单!!太感谢了!! Ps.:我已经有了转储文件,并没有考虑在上面搜索字符串:P【参考方案4】:
我一直在寻找相同但找不到它,所以我用 php 制作了一个小脚本,你可以在以下位置找到它: http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/
祝你好运! (我删除了一些私有代码,如果我没有在过程中破坏它,请告诉我:D)
【讨论】:
谢谢!你节省了我的时间!如果我可以选择设置区分大小写的搜索,我会更喜欢它:)【参考方案5】:我知道旧帖子,但是对于像我一样通过 Google 找到此帖子的其他人,如果您安装了 phpmyadmin,它具有全局搜索功能。
【讨论】:
如果您不知道实际的数据库怎么办?与 OP 一样,我需要查找特定 IP 地址的所有实例,并且我的 MySQL 数据库中有 5+ GB 的数据... 这个功能已经在新版本的 Phpmyadmin 中消失了 相比 phpMyAdmin,我更喜欢 HeidiSQL。同样的价格,更容易使用和更强大。也更快。 @pal4life - 该功能在 phpadmin 中仍然存在【参考方案6】:我不记得我是在哪里看到这个脚本的,但我一直在使用它和 XCloner 来移动我的 WP 多站点。
<?php
// Setup the associative array for replacing the old string with new string
$replace_array = array( 'FIND' => 'REPLACE', 'FIND' => 'REPLACE');
$mysql_link = mysql_connect( 'localhost', 'USERNAME', 'PASSWORD' );
if( ! $mysql_link)
die( 'Could not connect: ' . mysql_error() );
$mysql_db = mysql_select_db( 'DATABASE', $mysql_link );
if(! $mysql_db )
die( 'Can\'t select database: ' . mysql_error() );
// Traverse all tables
$tables_query = 'SHOW TABLES';
$tables_result = mysql_query( $tables_query );
while( $tables_rows = mysql_fetch_row( $tables_result ) )
foreach( $tables_rows as $table )
// Traverse all columns
$columns_query = 'SHOW COLUMNS FROM ' . $table;
$columns_result = mysql_query( $columns_query );
while( $columns_row = mysql_fetch_assoc( $columns_result ) )
$column = $columns_row['Field'];
$type = $columns_row['Type'];
// Process only text-based columns
if( strpos( $type, 'char' ) !== false || strpos( $type, 'text' ) !== false )
// Process all replacements for the specific column
foreach( $replace_array as $old_string => $new_string )
$replace_query = 'UPDATE ' . $table .
' SET ' . $column . ' = REPLACE(' . $column .
', \'' . $old_string . '\', \'' . $new_string . '\')';
mysql_query( $replace_query );
mysql_free_result( $columns_result );
mysql_free_result( $tables_result );
mysql_close( $mysql_link );
echo 'Done!';
?>
【讨论】:
brilliantsheep.com/…【参考方案7】:当我们在 Wordpress 网站上更改域时,我自己也在寻找这个。没有一些编程就无法完成,所以这就是我所做的。
<?php
header("Content-Type: text/plain");
$host = "localhost";
$username = "root";
$password = "";
$database = "mydatabase";
$string_to_replace = 'old.example.com';
$new_string = 'new.example.com';
// Connect to database server
mysql_connect($host, $username, $password);
// Select database
mysql_select_db($database);
// List all tables in database
$sql = "SHOW TABLES FROM ".$database;
$tables_result = mysql_query($sql);
if (!$tables_result)
echo "Database error, could not list tables\nMySQL error: " . mysql_error();
exit;
echo "In these fields '$string_to_replace' have been replaced with '$new_string'\n\n";
while ($table = mysql_fetch_row($tables_result))
echo "Table: $table[0]\n";
$fields_result = mysql_query("SHOW COLUMNS FROM ".$table[0]);
if (!$fields_result)
echo 'Could not run query: ' . mysql_error();
exit;
if (mysql_num_rows($fields_result) > 0)
while ($field = mysql_fetch_assoc($fields_result))
if (stripos($field['Type'], "VARCHAR") !== false || stripos($field['Type'], "TEXT") !== false)
echo " ".$field['Field']."\n";
$sql = "UPDATE ".$table[0]." SET ".$field['Field']." = replace(".$field['Field'].", '$string_to_replace', '$new_string')";
mysql_query($sql);
echo "\n";
mysql_free_result($tables_result);
?>
希望它对将来遇到此问题的人有所帮助:)
【讨论】:
【参考方案8】:SQLyog 是基于 GUI 的解决方案,用于解决跨所有列、表和数据库的数据搜索问题。可以自定义搜索,将其限制为字段、表和数据库。
在其Data Search
功能中,人们可以像使用 Google 一样搜索字符串。
【讨论】:
但只有终极版才能做到。 webyog.com/product/sqlyogFeatureListExpanded【参考方案9】:您可以通过使用HeidiSQL 来做到这一点,而无需生成 Db 转储
步骤:
1) 从GUI的左侧面板中选择您需要搜索的数据库。
2) 导出 > 将数据库导出为 SQL
3) 在表格工具窗口中选择“查找文本”选项卡。
4) 提供要搜索的字符串并点击“FIND”。
5) 它将列出所有包含我们字符串的表。
6) 选择相关性%较高的行。
7) 点击“查看结果”
【讨论】:
【参考方案10】:本视频的前 30 秒展示了如何使用 Phpmyadmin 的全局搜索功能 它有效。它会在每个表中搜索一个字符串。
http://www.vodahost.com/vodatalk/phpmyadmin-setup/62422-search-database-phpmyadmin.html
【讨论】:
【参考方案11】:在unix机器上,如果数据库不是太大:
mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S
【讨论】:
【参考方案12】:使用 MySQL Workbench,您可以从“数据库”->“搜索表数据”菜单选项中搜索字符串。
指定 LIKE %URL_TO_SEARCH% 并在左侧选择您要搜索的所有表。可以使用“Cntrl + A”选择左侧的整棵树,然后取消选择你不关心的对象。
【讨论】:
【参考方案13】:在 phpMyAdmin 中提供了“搜索”功能:
-
选择特定数据库而不是表。
点击“搜索”标签
输入您想要的搜索词
选择要在其中搜索的表
phpMyAdmin 屏幕截图:
MySQL Workbench 中也提供“搜索”功能:
-
数据库菜单 > 搜索表数据
选择您要搜索的数据库和表(它将仅在选定的表中搜索)
在搜索中,您可以使用 wildChars。
MySQL Workbench 屏幕截图:
【讨论】:
当转储文件很大时提取转储文件和搜索要好得多 我刚刚在 Mac os 10.12.6 上试用了 MySQLWorkbench 6.3.9 版,它具有“全局搜索”功能 Adminer(单 PHP 文件超高速 (My)SQL 工具还具有搜索功能(每个数据库)-adminer.org【参考方案14】:如果您可以使用 bash - 这是一个脚本: 它需要一个用户 dbread,并在数据库上传递 dbread。
#!/bin/bash
IFS='
'
DBUSER=dbread
DBPASS=dbread
echo -n "Which database do you want to search in (press 0 to see all databases): "
read DB
echo -n "Which string do you want to search: "
read SEARCHSTRING
for i in `mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | head -1\``
do
for k in `mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | head -1\` | grep -v int | awk 'print $1'`
do
if [ `mysql $DB -u$DBUSER -p$DBPASS -e "Select * from $i where $k='$SEARCHSTRING'" | wc -l` -gt 1 ]
then
echo " Your searchstring was found in table $i, column $k"
fi
done
done
如果有人想要解释:http://infofreund.de/?p=1670
【讨论】:
【参考方案15】:MikeW 提出了一个有趣的解决方案,但正如 cmets 中所述,它是 SQL Server 解决方案而不是 MySQL 解决方案。这是一个 MySQL 解决方案:
use information_schema;
set @q = 'Boston';
set @t = 'my_db';
select CONCAT('use \'',@q,'\';') as q UNION
select CONCAT('select \'', tbl.`TABLE_NAME`,'\' as TableName, \'', col.`COLUMN_NAME`,'\' as Col, `',col.`COLUMN_NAME`,'` as value from `' , tbl.`TABLE_NAME`,'` where `' ,
col.`COLUMN_NAME` , '` like \'%' ,@q, '%\' UNION') AS q
from `tables` tbl
inner join `columns` col on tbl.`TABLE_NAME` = col.`TABLE_NAME`and col.DATA_TYPE='varchar'
where tbl.TABLE_SCHEMA = @t ;
【讨论】:
如此接近。一些问题: 1. 这会产生一个无效的尾随UNION
。 2.第四行应该是select CONCAT('use \'',@t,'\';') as q UNION
3.变量不明确。最好叫他们@search
和@database
【参考方案16】:
使用两 (2) 个简单代码 here 找到了一种方法。先做一个mysqldump:
mysqldump -uUSERNAME -p DATABASE_NAME > database-dump.sql
然后grep sqldump 文件:
grep -i "Search string" database-dump.sql
它possible 也到find/replace 和re-import 回到数据库。
【讨论】:
几十年来一直在使用 oracle/mysql(和其他),我赞同转储和使用 grep/sed/awk 并重新导入的想法。比(你必须承认这一点)有点古怪的 SQL 语言要容易得多。以上是关于在mysql数据库中搜索所有出现的字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在所有字段、表和数据库中搜索字符串的 MySQL 工具 [重复]
在所有字段、表和数据库中搜索字符串的 MySQL 工具 [重复]
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过 相邻的