使用MySQL查询查找和替换整个表中的文本

时间:2012-08-07 03:59:56

标签: mysql phpmyadmin

通常我使用手动查找使用phpmyadmin替换MySQL数据库中的文本。我现在已经厌倦了,如何运行查询来查找和替换phpmyadmin中整个表中的新文本的文本?

示例:查找关键字domain.com,替换为www.domain.com

13 个答案:

答案 0 :(得分:504)

对于single table更新

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

来自multiple tables -

如果您想要从所有表格中进行修改,最好的方法是点击dump,然后find/replace并将其上传回来。

答案 1 :(得分:31)

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

所有命令都是Linux上的bash,来自内存。

将数据库转储到文本文件

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

运行sed命令查找/替换目标字符串

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

将数据库重新加载到MySQL

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

轻松自负。

答案 2 :(得分:26)

将它放在一个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']);
}

答案 3 :(得分:21)

在PHPmyadmin中运行SQL查询以查找和替换所有wordpress博客帖子中的文本,例如找到mysite.com/wordpress并用mysite.com/news替换它 此示例中的表是tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')

答案 4 :(得分:8)

 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

例如,如果我想用Mark替换所有出现的John,我将在下面使用

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

答案 5 :(得分:7)

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

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_%';

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

答案 6 :(得分:2)

我相信“swapnesh”的答案是最好的!不幸的是我无法在phpMyAdmin(4.5.0.2)中执行它,虽然它不合逻辑(并尝试了几件事)但它仍然说发现了一个新的声明并且没有找到分隔符......

因此,我提出了以下解决方案,如果您遇到同样的问题并且没有其他数据库的访问权限而不是PMA,则可能会有用...

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`;

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

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`;

答案 7 :(得分:1)

phpMyAdmin包含一个简洁的查找和替换工具。

选择表格,然后点击搜索> 查找并替换

此查询耗时约一分钟,并成功地用列oldurl.ext中的newurl.ext替换了数千个post_content实例

screenshot of the find-and-replace feature in phpMyAdmin

关于此方法的最好的事情:在提交之前,您必须检查每个匹配项。

我正在使用phpMyAdmin 4.9.0.1

答案 8 :(得分:0)

生成更改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&gt; upgrade_script.sql

删除文件开头的所有垃圾。我有一些。

nano upgrade_script.sql

使用--force选项运行生成的脚本以跳过错误。 (慢 - 如果大DB那就拿咖啡)

mysql -u root -p your_db_name_here --force&lt; upgrade_script.sql

答案 9 :(得分:0)

最好将其导出为sql文件,并使用Visual Studio代码之类的编辑器将其打开,然后查找并重新排列您的单词。 我在1分钟内用1个gig文件sql替换了16个单词,总共是14600个单词。 这是最好的方法。 替换后保存并再次导入。 不要忘了用zip压缩以进行导入。

答案 10 :(得分:0)

如果您确定没有要更新的字段都被序列化,那么上面的解决方案将很好地工作。

但是,如果任何需要更新的字段都包含序列化的数据,则SQL查询或转储文件上的简单搜索/替换将破坏序列化-除非替换的字符串与搜索的字符串具有完全相同的字符数。

可以肯定的是,“序列化”字段如下所示:

a:1:{s:13:"administrator";b:1;}  

相关数据中的字符数被编码为数据的一部分。这是一种轻松地将“对象”转换为易于存储在数据库中的格式的方法。这是一个explanation of how, why, and different methods,用于序列化对象数据。 Here is another description,但使用简单的语言。

如果MySQL有一些内置工具可以正确处理序列化数据,那真是令人惊讶,但事实并非如此。
(为公平起见,上一个链接说明了这样做为什么甚至没有意义。)

wp-cli
上面的一些答案似乎是特定于WordPress数据库的,该数据库将其许多数据序列化。 WordPress提供了一个命令行工具wp search-replace,该工具可以执行序列化操作。
基本命令是:

    wp search-replace 'an-old-string' 'a-new-string' --dry-run

但是,wordpress强调guid should never be changed,因此建议跳过该列。它还表明,通常您会希望跳过wp_users表。如下所示:

wp search-replace 'https://old-domain.com' 'https://shiney-new-domain.com' --skip-columns=guid --skip-tables=wp_users --dry-run

注意:我添加了--dry-run标志,因此复制粘贴不会自动破坏任何人的数据库。确定脚本完成了您想要的操作后,请在没有该标志的情况下再次运行它。

插件
如果您使用的是WordPress,则还有许多免费的和商业的插件可提供gui界面来执行相同操作,并附带许多其他功能。

互连/ PHP脚本
Interconnect / it提供了一个php脚本来处理序列化的数据Safe Search and Replace工具,该工具是为在WordPress网站上使用而创建的,但是看起来它可以在由PHP序列化的任何数据库上使用。许多公司,包括WordPress本身都推荐此工具。 Instructions在这里,大约向下3/4。

答案 11 :(得分:0)

对于大写字母-小写字母的句子, 我们可以使用BINARY REPACE

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')

答案 12 :(得分:0)

UPDATE  `MySQL_Table` 
SET  `MySQL_Table_Column` = REPLACE(`MySQL_Table_Column`, 'oldString', 'newString')
WHERE  `MySQL_Table_Column` LIKE 'oldString%';