使用MySQL查询在整个表中查找和replace文本

通常我使用手动查找来使用phpmyadminreplaceMySQL数据库中的文本。 我现在厌倦了,我怎么能运行一个查询来查找和replace文本在phpmyadmin整个表中的新文本?

例如:查找关键字domain.com ,replace为www.domain.com

对于single table更新

  UPDATE `table_name` SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text') 

multiple tables

如果你想从所有表格编辑,最好的办法是采取dump ,然后find/replace并上传回来。

把它放在一个php文件中,运行它,它应该做你想做的事情。

 // Connect to your MySQL database. $hostname = "localhost"; $username = "db_username"; $password = "db_password"; $database = "db_name"; mysql_connect($hostname, $username, $password); // The find and replace strings. $find = "find_this_text"; $replace = "replace_with_this_text"; $loop = mysql_query(" SELECT concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s FROM information_schema.columns WHERE table_schema = '{$database}'") or die ('Cant loop through dbfields: ' . mysql_error()); while ($query = mysql_fetch_assoc($loop)) { mysql_query($query['s']); } 

我find的最简单的方法是将数据库转储到文本文件,运行sed命令进行replace,然后将数据库重新加载到MySQL中。

所有的命令都是从Linux内存打开的。

将数据库转储到文本文件

 mysqldump -u user -p databasename > ./db.sql 

运行sed命令查找/replace目标string

 sed -i 's/oldString/newString/g' ./db.sql 

重新加载数据库到MySQL

 mysql -u user -p databasename < ./db.sql 

十分简单。

在PHPmyadmin中运行SQL查询来查找并replace所有WordPress博客文章中的文本,例如查找mysite.com/wordpress,并用mysite.com/newsreplace该文本。此示例中的表格为tj_posts

 UPDATE `tj_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news') 
  UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required); 

比如说,如果我想用马克来代替John的所有事件,我会在下面使用,

 UPDATE student SET student_name = replace(student_name, 'John', 'Mark'); 

另一种select是为数据库中的每个列生成语句:

 SELECT CONCAT( 'update ', table_name , ' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');' ) AS statement FROM information_schema.columns WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%'; 

这应该生成一个可以执行的更新语句列表。

我相信“swapnesh”答案是最好的! 不幸的是,我不能在phpMyAdmin(4.5.0.2)中执行它,虽然不合逻辑(尝试了几件事情),但它一直说一个新的语句被发现,并且没有发现分隔符。

因此,我提出了以下解决scheme,如果您遇到同样的问题,并且没有其他访问数据库的权限,那么可能是有用的。

 UPDATE `wp_posts` AS `toUpdate`, (SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid` FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated` SET `toUpdate`.`guid`=`updated`.`guid` WHERE `toUpdate`.`ID`=`updated`.`ID`; 

要testing您可能想要使用的预期结果:

 SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid` FROM `wp_posts` AS `toUpdate`, (SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid` FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated` WHERE `toUpdate`.`ID`=`updated`.`ID`; 

生成更改SQL查询(FAST)

mysql -e“SELECT CONCAT('update',table_name,'set',column_name,'= replace(',column_name,',''www.oldsite.com'',''www.newsite.com''); ')AS语句FROM information_schema.columns WHERE table_name LIKE'wp_%'“-u root -p your_db_name_here> upgrade_script.sql

在文件开始处删除任何垃圾。 我有一些。

nano upgrade_script.sql

使用–force选项运行生成的脚本来跳过错误。 (慢 – 如果大DB抢咖啡)

mysql -u root -p your_db_name_here –force <upgrade_script.sql