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

Posted

技术标签:

【中文标题】使用 MySQL 查询查找和替换整个表中的文本【英文标题】:Find and Replace text in the entire table using a MySQL query 【发布时间】:2012-08-04 01:26:54 【问题描述】:

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

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

【问题讨论】:

***.com/questions/639531/…的可能重复 你可以做一些类似[this][1]的事情。 [1]:***.com/questions/562457/… This 将帮助您实现所需。 MySQL string replace的可能重复 【参考方案1】:

对于single table 更新

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

来自multiple tables-

如果您想从所有表格中进行编辑,最好的方法是获取dump 然后find/replace 并上传回来。

【讨论】:

这是替换整个字段,还是在字段中进行子字符串匹配? 它将替换字段 @RandyGreencorn 中的子字符串。它也区分大小写。 它会将“domain.com”替换为“www.domain.com”,将“www.domain.com”替换为“www.www.domain.com” 更多信息: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 效果很好。正如其他人所说,有时我必须弄乱引号才能让它在 phpMyAdmin 中工作。我用它在包含完整网址的列中仅用“https:”替换文本“http:”。其余网址保持不变。【参考方案2】:

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

【讨论】:

感谢您的询问。对于我的 WordPress 网站,列名是 wp_posts,所以查询看起来像 UPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')【参考方案3】:

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

【讨论】:

对我没用,不过是个好建议 - 会很甜蜜【参考方案4】:
 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】:

我找到的最简单的方法是将数据库转储到文本文件,运行 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

简单易懂。

【讨论】:

这运行得非常快。我喜欢这个解决方案。我不得不做一些 url 替换,而不是使用斜杠作为分隔符,而是使用管道(阅读 grymoire.com/Unix/Sed.html)。示例:sed -i 's|olddomain.com|http://newdomain.com|g' ./db.sql 它太快了,我以为它不起作用。但它做到了!此外,您可以像这样转义斜线:\/\/domain.com 提醒一下,在 OS X 中,sed -i 命令可能会抛出 unterminated substitute pattern 错误。您可以改用sed -i '' -e 's/oldString/newString/g' ./db.sql 那太好了。我有一个小备份,因为我们永远不知道,就在 mysqldump 之后:cp dl.sql db.sqlBACK【参考方案6】:

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

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

这应该会生成一个更新语句列表,然后您可以执行这些语句。

【讨论】:

比dump慢,但是对于命令行不习惯的人来说,这个回答很有创意,很有效。 这是迄今为止最好的方法,如果您有大量数据并且无法转储/重新加载它。 天哪,这太棒了!我将根据这个想法分享我的脚本 这是一个被低估的解决方案。完全为我工作。【参考方案7】:

我相信“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`;

【讨论】:

【参考方案8】:

生成更改 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

【讨论】:

【参考方案9】:

最好将其导出为 sql 文件并使用编辑器(如 Visual Studio Code)打开它,然后查找并替换您的文字。 我在 1 分钟内将 1 个演出文件 sql 替换为 16 个字,总计 14600 个字。 这是最好的方法。 替换后保存并再次导入。 不要忘记用 zip 压缩它以进行导入。

【讨论】:

【参考方案10】:

如果您确定没有任何要更新的字段被序列化,则上述解决方案将很好地工作。

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

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

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

相关数据中的字符数被编码为数据的一部分。 序列化是一种将“对象”转换为易于存储在数据库中的格式,或在不同语言之间轻松传输对象数据的方法。 这是对用于序列化对象数据的different methods 的解释,以及您可能想要这样做的原因,这里是一个以 WordPress 为中心的帖子:Serialized Data, What Does That Mean And Why is it so Important? 用简单的语言。

如果 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 界面来做同样的事情,并包含许多附加功能。

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

【讨论】:

我只是想补充一点,我之前没有遇到过 wp-cli,但是感谢您的帖子,在替换旧的 url 字符串后,我成功地迁移了我的网站并成功访问了它。 【参考方案11】:

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

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

此查询花费了大约一分钟,并成功地将数千个 oldurl.ext 实例替换为 post_content 列中的 newurl.ext

这种方法的最大好处是:您可以在提交之前检查每场比赛。

注意我正在使用 phpMyAdmin 4.9.0.1

【讨论】:

这是我尝试过的唯一有效的方法!【参考方案12】:

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

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

【讨论】:

【参考方案13】:
UPDATE  `MySQL_Table` 
SET  `MySQL_Table_Column` = REPLACE(`MySQL_Table_Column`, 'oldString', 'newString')
WHERE  `MySQL_Table_Column` LIKE 'oldString%';

【讨论】:

值得注意的是,这只适用于 oldString 位于值开头的位置,因此“1oldString2”不会被替换,但“oldString2”会 - 替换您需要的所有实例 LIKE '%oldString%'(注意额外的 %)

以上是关于使用 MySQL 查询查找和替换整个表中的文本的主要内容,如果未能解决你的问题,请参考以下文章

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

t-sql 用户定义函数,用表中的查找替换文本

从 Excel 工作表中查找并替换所有文本文件中的字符串

如何替换整个数据库中的字符串(数据值)?

我想知道如何运行 vba 脚本来查找和替换仅在一张工作表中而不是整个工作组中的多个单词?

从整个数据库中查找和替换列值