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

例如:查找关键字domain。例如,替换为www.domain.example。


当前回答

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

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

可以肯定的是,“序列化”字段看起来是这样的:

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

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

如果MySQL有一些内置的工具来自动处理序列化数据,那就太神奇了,但它没有,而且由于存在不同的序列化格式,它这样做甚至没有意义。

wp-cli 上面的一些答案似乎是针对WordPress数据库的,因为它序列化了很多数据。WordPress提供了一个命令行工具,wp搜索-替换,它可以处理序列化。 一个基本的命令是:

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

然而,WordPress强调永远不应该改变guid,所以它建议跳过这一列。 它还建议您经常希望跳过wp_users表。 下面是它的样子:

Wp搜索-替换'https://old-domain。示例' 'https://shiney-new-domain.com'——skip-columns=guid——skip-tables=wp_users——演练

注意:我添加了——dry-run标志,这样复制粘贴就不会自动破坏任何人的数据库。在您确定脚本执行了您想要的操作之后,再次运行它,不要使用该标志。

插件 如果你正在使用WordPress,也有许多免费和商业插件提供了gui界面来做同样的事情,并打包了许多额外的功能。

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

其他回答

在phpMyAdmin中运行SQL查询来查找和替换所有WordPress博客文章中的文本,例如查找mysite。Example /wordpress,然后用mysite。Example /news替换 本例中的表为tj_posts

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

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

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

可以肯定的是,“序列化”字段看起来是这样的:

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

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

如果MySQL有一些内置的工具来自动处理序列化数据,那就太神奇了,但它没有,而且由于存在不同的序列化格式,它这样做甚至没有意义。

wp-cli 上面的一些答案似乎是针对WordPress数据库的,因为它序列化了很多数据。WordPress提供了一个命令行工具,wp搜索-替换,它可以处理序列化。 一个基本的命令是:

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

然而,WordPress强调永远不应该改变guid,所以它建议跳过这一列。 它还建议您经常希望跳过wp_users表。 下面是它的样子:

Wp搜索-替换'https://old-domain。示例' 'https://shiney-new-domain.com'——skip-columns=guid——skip-tables=wp_users——演练

注意:我添加了——dry-run标志,这样复制粘贴就不会自动破坏任何人的数据库。在您确定脚本执行了您想要的操作之后,再次运行它,不要使用该标志。

插件 如果你正在使用WordPress,也有许多免费和商业插件提供了gui界面来做同样的事情,并打包了许多额外的功能。

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

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

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

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

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

当在phpmyadmin中进行搜索和替换时,我有很好的运气:

更新表名SET fieldName1 = 'foo' WHERE fieldName1 = 'bar';

当然,这一次只适用于一个表。