如何在MySQL数据库中查找和替换单个字符串?

3
我正在将我的WordPress网站转移到新的服务器并同时更改域名,这意味着我必须在MySQL数据库中查找和替换多个字段。

具体来说,每当像“http://olddomain.com/?p=34”这样的字段中出现“olddomain.com”时,我都必须将其替换为“newdomain.com”。

我该如何在MySQL数据库中进行大规模的查找和替换?我知道SQL命令LIKE可以查找包含“olddomain.com”的字段,但是如何替换特定部分的字段呢?


对于那些有兴趣在不同域名之间迁移WordPress的人,我已经编写了一个小型迁移工具来帮助简化这个过程:https://github.com/jeremyharris/wp-tools - jeremyharris
4个回答

5
你可以使用这个搜索和替换脚本来实现这个目的。

http://interconnectit.com/124/search-and-replace-for-wordpress-databases/

作为作者所说,原始的replace在这些情况下并不好。
当你迁移WordPress(或任何其他使用序列化PHP字符串在数据库中的平台)之间的域时,必须使用安全的搜索和替换方法来保持序列化字符串长度的完整性。例如从localhost到thenewdomain.com的转储文件简单地问题是字符串的长度改变了,但序列化字符串的索引没有改变。因此设置丢失并且小部件消失。不好。
Wordpress.org文档本身中提到。

4

你可以使用 MySQL 的 REPLACE() 函数:

UPDATE `table` SET `fieldname` = REPLACE(fieldname, 'olddomain', 'newdomain');

另一个选择是将数据库转储,然后在您选择的编辑器中使用查找和替换功能。


2
值得注意的是,WordPress 存储了大量序列化数据(例如小部件选项等),而这种方法会破坏这些数据。 - jeremyharris
谢谢。但是为什么会破坏那些数据呢?将旧的序列化数据替换为新数据不是更好吗? - dangerChihuahua007
2
序列化数据依赖于字符串长度等因素(如果您查看数据,您会看到类似s:6:"string"的内容)。更改字符串长度会导致PHP在尝试反序列化时失败。因此,如果域名具有相同的长度,您可能会有好运 :) - jeremyharris
1
在这种情况下,“替换”是有问题的,因为字符串的长度会改变,但序列化字符串的索引不会改变。这会导致问题和设置可能会丢失。 - Prasenjit Kumar Nag
无论如何,移动WordPress网站没有简单的方法,因为它硬编码了所有内容。通常会出现一些问题,我发现了这一点。至少知道可能会出现什么问题是有帮助的。 - jeremyharris
我之前发现了这个网站http://interconnectit.com/124/search-and-replace-for-wordpress-databases/,对我很有帮助。 - Prasenjit Kumar Nag

1

这应该会对你有所帮助。它将仅用newdomain.com替换olddomain.com。在olddomain.com左右的字符串将保持不变。

UPDATE tablename 
SET columnname = REPLACE(columnname, 'olddomain.com', 'newdomain.com')
WHERE columnname LIKE '%olddomain.com%';

这是函数的工作原理 - REPLACE(text_string, from_string, to_string)


-1

由于更换服务器意味着必须转储数据库,因此您可以在创建脚本中仅将olddomain替换为newdomain。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接