如何在数据库中搜索和替换字符串的所有实例?
Posted
技术标签:
【中文标题】如何在数据库中搜索和替换字符串的所有实例?【英文标题】:How to search and replace all instances of a string within a database? 【发布时间】:2010-10-24 13:53:51 【问题描述】:我有一个字符串包含在 wordpress 安装(服务器名称)中数千次,跨越多个列、记录和表。
我想用另一台服务器的位置更新它 - 我们正在移动内容。
所以来源类似于http://my-server1/some/link/to/something,我想用http://my-other-server/some/link/to/something 替换它。我基本上希望对http://my-server1 的每个实例重复此过程。
在 mysql 中是否有一种简单的方法可以做到这一点?一个工具? 还是我很遗憾地不得不更新每条记录有问题?
谢谢,
【问题讨论】:
在数据库中包含这些类型的数据(数据至少应该是绝对路径)是一个非常糟糕的主意,因为您需要在移动时更改它。为什么你在 Wordpress 安装中仍然有网站的 URL?应该只有一个全局站点首选项。 【参考方案1】:一种粗略(但有效)的方法是将架构转储到文件中,仔细应用搜索和替换,然后重新导入。
事实上,我今天就这样做了:)
【讨论】:
很高兴它有帮助。只需确保您仔细应用替换,并且只更改您真正想要的。 我必须执行至少 2000 次替换而不是一次替换的情况如何?你能帮忙吗? @SachinKRaj:我会非常小心地编写一个包含 2000 个sed
语句的 shell 脚本。
这是单个简单值的好方法,但在某些需要替换字符串的字符数的序列化数组数据的情况下可能会失败。 (wp 在默认数据库中有一些)
正如 Obmerk 提到的,这会因 SERIALIZED 数据而失败。有没有办法用序列化数据来实现这一点?重新计算【参考方案2】:
在谷歌搜索中发现了这个,但这可能对某些人有帮助。如果您知道表和列(您可以使用 phpMyAdmin 中的通配符搜索找到),
UPDATE table_name SET column_name = REPLACE(column_name, 'http://oldsite.com','http://newsite.com');
用您自己的替换粗体部分。
如果您有一个大型数据库,您可以将其应用到可以循环遍历每个表和列的脚本中。
【讨论】:
REPLACE ()
也会处理序列化的数组数据吗?
@ObmerkKronen 一般来说,不,但如果替换字符串与被替换字符串的长度相同,则可以。【参考方案3】:
如果您愿意重新导入整个数据库,最好使用 MySQL 转储方法。对于不想这样做的任何人 - WordPress 核心安装实际上只包含 11 个表,其中很少有内容列,因此按列替换同样容易。假设您没有大量引用链接或字符串的插件表,这将是您的 SQL:
UPDATE wp_commentmeta SET meta_value = REPLACE(meta_value,'xcurrentx','xreplacementx');
UPDATE wp_comments SET comment_content = REPLACE(comment_content,'xcurrentx','xreplacementx');
UPDATE wp_links SET link_description = REPLACE(link_description,'xcurrentx','xreplacementx');
UPDATE wp_options SET option_value = REPLACE(option_value,'xcurrentx','xreplacementx');
UPDATE wp_postmeta SET meta_value = REPLACE(meta_value,'xcurrentx','xreplacementx');
UPDATE wp_posts SET post_content = REPLACE(post_content,'xcurrentx','xreplacementx');
UPDATE wp_posts SET post_title = REPLACE(post_title,'xcurrentx','xreplacementx');
UPDATE wp_posts SET post_excerpt = REPLACE(post_excerpt,'xcurrentx','xreplacementx');
UPDATE wp_term_taxonomy SET description = REPLACE(description,'xcurrentx','xreplacementx');
UPDATE wp_usermeta SET meta_value = REPLACE(meta_value,'xcurrentx','xreplacementx');
【讨论】:
这实际上是更好的答案。我不知道为什么其他答案被选为正确,并且有这么多票【参考方案4】:您的问题已在 2009 年发布,在那一年,另一个人开发了一个基本的 php 工具来在某个数据库的所有表中搜索字符串。 (可选)您也可以用不同的字符串替换所有出现的位置。
5 年后(在撰写本文时),在我看来,对 Wordpress 安装使用此工具比使用 mysql 转储有效且容易得多(尽管您可能希望在运行脚本之前也创建一个转储用于备份目的)。
您可以在其作者Eric Amundson 的博客和项目的启动板页面MySQL Search & Replace 中找到更多信息
我不相信你在这么久之后仍然在寻找答案,但我决定也发布我的提示,希望它可以帮助其他人在未来突然出现在这里仍然在寻找这个问题的解决方案.
【讨论】:
【参考方案5】:除了 Brad Larson 的回答 - 设置如下变量:
SET @what_to_be_replaced = "what_to_be_replaced", @to_be_replaced_by = "to_be_replaced_by";
然后按如下方式使用:
UPDATE wp_commentmeta SET meta_value = REPLACE(meta_value, @what_to_be_replaced, @to_be_replaced_by );
【讨论】:
【参考方案6】:还有一个名为 Search Regex 的 Wordpress 插件,它允许在整个数据库中运行 grep
搜索和替换。
【讨论】:
【参考方案7】:MySQL 的 REPLACE 或在 WordPress 中手动替换 sql 文件或 db 中的字符串不是一个好方法。 WordPress 使用序列化字段,如果您替换其中的某些字符串(我的情况就是这样),这些字段可能会中断
我使用了非常适合我的 Better Search Replace 插件
【讨论】:
很遗憾,如果您甚至无法登录您的网站,因为数据库中已经存在不正确的绝对 URL。【参考方案8】:我最近不得不进行 wordpress 迁移,我不得不更改网站的域名(在帖子数据和其他地方出现了 1012 次网站名称)。 我尝试了mysqldump的方法,用sed把旧的换成了新的域名。重新导入后这个可怕的失败,正是因为 wordpress 记录中存在序列化数组数据(我的新域名比旧域名短 2 个字符)。 真正有效的是 wp-CLI,一个用于管理任务的 wordpress 命令行界面。 wp-cli 具有用于数据库字符串的内置搜索替换功能,该功能还负责处理序列化记录。它使用存储在 wp-config.php 中的凭据,因此直接针对 wordpress 数据库(如果您的 mariadb 实例还托管其他数据库)。它只是您下载并放在路径中的文件夹中的单个 php 文件。见https://wp-cli.org/
【讨论】:
以上是关于如何在数据库中搜索和替换字符串的所有实例?的主要内容,如果未能解决你的问题,请参考以下文章
如何用另一个表中的匹配值替换/更新列中每个字符串的所有实例?