我正在试图弄清楚如何在数据库中找到所有出现的url。我想搜索所有表格和所有字段。但我不知道从哪里开始,或者甚至可能。
答案 0 :(得分:187)
一个简单的解决方案就是做这样的事情:
mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename > myfile.sql
然后你可以在myfile.sql上找到你想要的URL。
答案 1 :(得分:87)
在 phpMyAdmin 中,可以使用“搜索”功能:
phpMyAdmin 截图:
MySQL Workbench :
中也提供了“搜索”功能MySQL Workbench 屏幕截图:
答案 2 :(得分:60)
旧帖我知道,但对于其他通过谷歌发现这一点的人,如果你安装了phpmyadmin,它就有了全局搜索功能。
答案 3 :(得分:15)
使用MySQL Workbench,您可以从“数据库”中搜索字符串 - > “搜索表数据”菜单选项。
指定LIKE%URL_TO_SEARCH%,并在左侧选择要搜索的所有表格。您可以使用“Cntrl + A”选择左侧的整个树,然后取消选择您不关心的对象。
答案 4 :(得分:13)
蛮力方法
declare @url varchar(255)
set @url = 'stackoverflow.com'
select 'select * from ' + rtrim(tbl.name) + ' where ' +
rtrim(col.name) + ' like %' + rtrim(@url) + '%'
from sysobjects tbl
inner join syscolumns col on tbl.id = col.id
and col.xtype in (167, 175, 231, 239) -- (n)char and (n)varchar, there may be others to include
and col.length > 30 -- arbitrary min length into which you might store a URL
where tbl.type = 'U' -- user defined table
这将创建一个可以在数据库上执行的脚本。
select * from table1 where col1 like '%stackoverflow.com%'
select * from table1 where col2 like '%stackoverflow.com%'
select * from table2 where col3 like '%stackoverflow.com%'
等
答案 5 :(得分:8)
您可以使用HeidiSQL执行此操作而不生成Db转储
<强>步骤强>:
1)从GUI的左侧面板中选择您需要搜索的数据库。
2)导出&gt;将数据库导出为SQL
3)在“表格工具”窗口中,选择“查找文本”标签。
4)提供要搜索的字符串,然后点击“查找”。
5)它将列出包含我们字符串的所有表。
6)选择相关性%的行。
7)点击“查看结果”
答案 6 :(得分: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);
?>
希望它可以帮助那些在将来遇到这个问题的人:)
答案 7 :(得分:5)
SQLyog是基于GUI的解决方案,用于解决跨所有列,表和数据库的数据搜索问题。可以自定义搜索,将其限制为字段,表格和数据库。
在其Data Search
功能中,人们可以像使用Google一样搜索字符串。
答案 8 :(得分:3)
找到一种方法,包含两(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返回数据库。
答案 9 :(得分:3)
我编写了一个ruby程序来遍历一个mysql数组,以获取作为cla传递的给定字符串。只有CLI版本没有GUI。
答案 10 :(得分:3)
MikeW提出了一个有趣的解决方案,但正如评论中所提到的,它是一个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 ;
答案 11 :(得分:3)
如果你可以使用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
答案 12 :(得分:2)
我无法记住我遇到过这个剧本的位置,但我一直在使用它与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!';
?>
答案 13 :(得分:1)
在unix机器中,如果数据库不是太大:
mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S
答案 14 :(得分:1)
此视频的前30秒显示了如何使用Phpmyadmin的全局搜索功能 它的工作原理。它将在每个表中搜索字符串。
http://www.vodahost.com/vodatalk/phpmyadmin-setup/62422-search-database-phpmyadmin.html
答案 15 :(得分:1)
我一直在找同样但找不到它,所以我用PHP编写一个小脚本,你可以在以下位置找到它: http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/
祝你好运! (我删除了一些私人代码,如果我在此过程中没有破解它,请告诉我:D)答案 16 :(得分:1)
也许如果你提供了一些关于你想要实现的目标的背景知识,其他人可能会提供更好的答案。
答案 17 :(得分:0)
不是一个优雅的解决方案,但你可以通过嵌套的循环结构实现它
// 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子句中组合每个表的所有列来加快速度。