通常我使用手动查找来使用 phpmyadmin 替换 MySQL 数据库中的文本。我现在厌倦了,如何运行查询以在 phpmyadmin 的整个表中查找文本并将其替换为新文本?
示例:查找关键字domain.com
,替换为www.domain.com
。
通常我使用手动查找来使用 phpmyadmin 替换 MySQL 数据库中的文本。我现在厌倦了,如何运行查询以在 phpmyadmin 的整个表中查找文本并将其替换为新文本?
示例:查找关键字domain.com
,替换为www.domain.com
。
single table
更新 _
UPDATE `table_name`
SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')
从multiple tables
——
如果您想从所有表中进行编辑,最好的方法是获取dump
然后find/replace
将其上传回来。
我发现最简单的方法是将数据库转储到文本文件,运行 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
十分简单。
把它放在一个 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']);
}
在 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')
另一种选择是为数据库中的每一列生成语句:
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_%';
这应该会生成一个更新语句列表,然后您可以执行这些语句。
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');
如果您确定没有任何要更新的字段被序列化,则上述解决方案将运行良好。
但是,如果任何需要更新的字段包含序列化数据、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 处。
UPDATE `MySQL_Table`
SET `MySQL_Table_Column` = REPLACE(`MySQL_Table_Column`, 'oldString', 'newString')
WHERE `MySQL_Table_Column` LIKE 'oldString%';
我相信“swapnesh”的答案是最好的!不幸的是,我无法在 phpMyAdmin (4.5.0.2) 中执行它,尽管不合逻辑(并尝试了几件事)它一直说找到了一个新语句并且没有找到分隔符......</p>
因此,我提出了以下解决方案,如果您遇到同样的问题并且除了 PMA 之外没有其他访问数据库的权限...</p>
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`;
最好将其导出为 sql 文件并使用编辑器(如 Visual Studio 代码)打开它,然后查找和替换您的单词。我在 1 分钟内将 1 个演出文件 sql 替换为 16 个字,总计 14600 个字。这是最好的方法。替换后保存并再次导入。不要忘记用 zip 压缩它以进行导入。
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
纳米升级脚本.sql
mysql -u root -p your_db_name_here --force < upgrade_script.sql
对于带有大写-小写字母的句子,我们可以使用 BINARY REPACE
UPDATE `table_1` SET `field_1` = BINARY REPLACE(`field_1`, 'find_string', 'replace_string')