在mysql数据库中search所有出现的string
我想弄清楚如何find一个数据库中的所有URL的事件。 我想search所有表格和所有字段。 但是我不知道从哪里开始,甚至可能。
一个简单的解决scheme就是这样做:
mysqldump -u myuser --no-create-info databasename > myfile.sql
然后你可以在myfile.sql上find你想要的URL。
老的post我知道,但对于其他人可以像我这样通过谷歌find这个,如果你安装了phpmyadmin,它有一个全球性的searchfunction。
在phpMyAdmin中有一个“search”function可用:
- select特定的数据库不是表。
- 点击“search”标签
- input你想要的search字词
- select您要search的表格
phpMyAdmin屏幕截图:
“search”function也可以在MySQL Workbench中使用 :
- 数据库菜单>search表数据
- select要search的数据库和表格(只会search选定的表格)
- 在search中,你可以使用wildChars。
MySQL Workbench屏幕截图:
使用MySQL Workbench,您可以从“数据库” – >“search表数据”菜单选项中searchstring。
指定LIKE%URL_TO_SEARCH%并在左侧select要search的所有表。 您可以使用“Cntrl + A”select左边的整个树,然后取消select不关心的对象。
蛮力法
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
这将创build一个脚本,您可以在数据库上执行。
select * from table1 where col1 like '%stackoverflow.com%' select * from table1 where col2 like '%stackoverflow.com%' select * from table2 where col3 like '%stackoverflow.com%'
等等
当我们在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); ?>
希望它可以帮助任何未来绊倒这个问题的人:)
您可以通过使用HeidiSQL而不生成Db转储来完成此操作
步骤 :
1)从GUI的左侧面板中select需要search的数据库。
2) 导出>导出数据库为SQL
3)在“表格工具”窗口中select“ 查找文本 ”选项卡。
4)提供您的string进行search,然后单击“ 查找 ”。
5)它会列出所有包含我们的string的表。
6)select相关度较高的行。
7)点击“ 查看结果 ”
SQLyog是基于GUI的解决scheme,解决跨所有列,表和数据库的数据search问题。 可以自定义search,将其限制在字段,表格和数据库中。
在其Data Search
function中,可以像使用Google一样searchstring。
如果你可以使用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
我写了一个ruby程序来遍历一个作为cla传递给定的string的MySQL数据库。 CLI版本没有GUI。
在这里find一个有两(2)个简单代码的方法。 首先做一个mysqldump :
mysqldump -uUSERNAME -p DATABASE_NAME > database-dump.sql
然后grep sqldump文件:
grep -i "Search string" database-dump.sql
也可以find/replace并重新导入数据库。
我不记得我在哪里看到这个脚本,但是我一直在用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!'; ?>
斯科特给出了一个很好的例子,但问题是你为什么要这么做? 如果您需要对特定string进行查找和replace,还可以尝试对数据库执行mysqldump,在编辑器中查找并replace,然后重新加载数据库。
也许如果你对自己想要达到的目标给出了一些背景知识,其他人可能会提供更好的答案。
我正在寻找相同的,但找不到它,所以我在PHP中创build一个小脚本,你可以在http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-一,数据库和文件/
祝你好运! (我删除了一些私人代码,让我知道如果我没有在这个过程中打破它:D)
此video的前30秒显示如何使用Phpmyadmin的全局searchfunction,它的工作原理。 它会search每个表中的string。
http://www.vodahost.com/vodatalk/phpmyadmin-setup/62422-search-database-phpmyadmin.html
在unix机器上,如果数据库不是太大:
mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S
MikeW提出了一个有趣的解决scheme,但正如在评论中提到的那样,这是一个SQL Server解决scheme,而不是MySQL解决scheme。 这里是一个MySQL解决scheme:
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 ;
不是一个优雅的解决scheme,但你可以用一个嵌套的循环结构来实现它
// 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 } }
您可以通过在构build列数组时检查哪些列包含string,还可以通过将每个表中的所有列组合在一个巨大的逗号分隔的WHERE子句中来加速这一过程。