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


235

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

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



1
您可以执行[this] [1]之类的操作。[1]:stackoverflow.com/questions/562457/…–
Pramod

2
将帮助您实现所需的功能。
Dom

Answers:


551

进行single table更新

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

来自multiple tables-

如果要从所有表进行编辑,最好的方法是先提取dump,然后再find/replace上传回去。


4
这会替换整个字段,还是替换字段中的子字符串?
兰迪·格林肯

3
它将替换@RandyGreencorn字段中的子字符串。它也是区分大小写的。
安德鲁

10
它将用“ www.domain.com”替换“ domain.com”,用“ www.www.domain.com”替换“ www.domain.com”
michelek 2016年

2
有关此内容的更多信息:If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.在转储中使用sed进行查找/替换:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
效果很好。正如其他人所说,有时我必须弄乱引号才能使其在phpMyAdmin中工作。我用它在包含完整网址的列中仅用“ https:”替换了文本“ http:”。其余网址未更改。
Heres2u

40

我发现的最简单的方法是将数据库转储到文本文件,运行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
这惊人地快。我喜欢这个解决方案。我不得不做一些URL替换,而不是使用斜杠作为分隔符,而是使用管道(请阅读grymoire.com/Unix/Sed.html)。示例:sed -i's | olddomain.com | http://newdomain.com | g './db.sql
Mike Kormendy 2015年

1
太快了,我以为那没用。但是,确实如此!另外,您可以这样逃脱斜线:\/\/domain.com
m.cichacz

2
提醒一下,在OS X中,该sed -i命令可能会抛出unterminated substitute pattern错误。您可以sed -i '' -e 's/oldString/newString/g' ./db.sql改用。
afterglowlee

25

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

没有为我工作,但是很好的建议-会很甜
AlexHighHigh '19

23

在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')

2
感谢您的查询。对于我的WordPress网站,列名是wp_posts这样,因此查询看起来UPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris

10

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

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

这将生成一个更新语句列表,然后可以执行。


2
速度比转储慢,但对于不熟悉命令行的人来说,此答案很有创意且有效。
Stephane

3
如果您有很多数据并且无法转储/重新加载,这是迄今为止最好的方法。
Kariem '17

噢,这很棒!我将基于这一理念分享我的剧本
安迪

这是一个被低估的解决方案。完全为我工作。
rw-intechra

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');

3

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

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

这个查询花费了大约一分钟,成功地取代的几千实例oldurl.extnewurl.ext列内post_content

phpMyAdmin中的查找和替换功能的屏幕截图

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

注意我正在使用phpMyAdmin 4.9.0.1


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

2

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

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

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

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

相关数据中的字符数被编码为数据的一部分。
序列化是一种将“对象”转换为易于存储在数据库中的格式或在不同语言之间轻松传输对象数据的方法。
这是对用于序列化对象数据的不同方法的解释,以及为什么要这样做,这是一个以WordPress为中心的文章:序列化数据,这意味着什么,为什么如此重要?用简单的语言。

如果MySQL有一些内置的工具来自动处理序列化的数据,那将是惊人的,但是事实并非如此,并且由于存在不同的序列化格式,因此这样做甚至没有意义。

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

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

但是,WordPress强调guid永远不要更改,因此建议跳过该列。
它还表明,通常情况下,您希望跳过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界面来执行相同操作,并附带许多其他功能。

Interconnect / it php脚本
Interconnect / it提供了一个php脚本来处理序列化数据:安全搜索和替换工具。它是为在WordPress网站上使用而创建的,但看起来可以在PHP序列化的任何数据库上使用。
许多公司,包括WordPress本身,都推荐此工具。此处的说明大约在页面3/4下。


1

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


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在哪里table_name就像'wp_%'“ -u root -p your_db_name_here> upgrade_script.sql

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

纳米升级_script.sql

使用--force选项运行生成的脚本以跳过错误。(慢-如果大数据库则去喝咖啡)

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


0

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

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.