有没有办法在mysql数据库中的所有表中查找/替换字符串?

时间:2010-07-07 15:47:15

标签: mysql search

我认为如果不进行转储,在.sql文件中搜索/替换,然后重新导入它,这是不可能的,但是我想问无论如何......

基本上,有没有办法在一个数据库中的所有表中的所有字段中搜索“samplestring”,并用“examplestring”替换它?

3 个答案:

答案 0 :(得分:2)

我不知道一个。如果你愿意/想要查看和修改列名和其他非数据内容,尤其如此。

如果你不经常这样做,那就没问题了。

mysqldump --username user --password pass database | sed 's/somestring/otherstring/g' | mysql -uroot -p

答案 1 :(得分:1)

您可以,但它需要使用动态SQL(MySQL's Prepared Statements)。

首先,您需要获取基于文本的列的列表:

SELECT c.column_name, c.table_name
  FROM INFORMATION_SCHEMA.COLUMNS c
 WHERE c.table_schema = your_db_name
   AND c.data_type IN ('varchar') -- don't want to replace on an INT/etc

然后你需要迭代该列表来创建UPDATE语句......

答案 2 :(得分:0)

以下是PHP的解决方案:

<?php

// edit this line to add old and new terms which you want to be replaced
$search_replace = array( 'old_term' => 'new_term', 'old_term2' => 'new_term2' );

//change the localhost,username,password and database-name according to your db
mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db("database-name") or die(mysql_error());

$show_tables = mysql_query( 'SHOW TABLES' );
while( $st_rows = mysql_fetch_row( $show_tables ) ) {
    foreach( $st_rows as $cur_table ) {
        $show_columns = mysql_query( 'SHOW COLUMNS FROM ' . $cur_table );
        while( $cc_row = mysql_fetch_assoc( $show_columns ) ) {
            $column = $cc_row['Field'];
            $type = $cc_row['Type'];
            if( strpos( $type, 'char' ) !== false || strpos( $type, 'text' ) !== false ) {
                foreach( $search_replace as $old_string => $new_string ) {
                    $replace_query = 'UPDATE ' . $cur_table .
                        ' SET ' .  $column . ' = REPLACE(' . $column .
                        ', \'' . $old_string . '\', \'' . $new_string . '\')';
                    mysql_query( $replace_query );
                }
            }
        }
    }
}
echo 'replaced';
mysql_free_result( $show_columns );
mysql_free_result( $show_tables );
mysql_close( $mysql_link );

?>

Source