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

aly*_*ina 226 mysql phpmyadmin

通常我使用手动查找使用phpmyadmin替换MySQL数据库中的文本.我现在已经厌倦了,如何运行查询来查找和替换phpmyadmin中整个表中的新文本的文本?

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

swa*_*esh 527

有关single table更新

 UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')
Run Code Online (Sandbox Code Playgroud)

来自multiple tables-

如果要从所有表中进行编辑,最好的方法是使用dump然后find/replace将其上传回来.

  • 它将用"www.domain.com"取代"domain.com",用"www.www.domain.com"取代"www.domain.com" (10认同)
  • 这是替换整个字段,还是在字段中进行子字符串匹配? (4认同)
  • 它将替换字段@RandyGreencorn中的子字符串.它也区分大小写. (3认同)
  • 更多相关信息:`如果你想从所有表编辑,最好的方法是转储,然后查找/替换并上传回来.在转储上使用sed查找/替换:`sed's:unwanted_text: wanted_text:g"dump.sql` (2认同)
  • 效果很好。正如其他人所说,有时我必须弄乱引号才能使其在phpMyAdmin中工作。我用它在包含完整网址的列中仅将文本“ http:”替换为“ https:”。其余网址未更改。 (2认同)

sil*_*tar 32

我发现最简单的方法是将数据库转储到文本文件,运行sed命令进行替换,然后将数据库重新加载回MySQL.

所有命令都是Linux上的bash,来自内存.

转储数据库到文本文件

mysqldump -u user -p databasename > ./db.sql
Run Code Online (Sandbox Code Playgroud)

运行sed命令查找/替换目标字符串

sed -i 's/oldString/newString/g' ./db.sql
Run Code Online (Sandbox Code Playgroud)

将数据库重新加载到MySQL中

mysql -u user -p databasename < ./db.sql
Run Code Online (Sandbox Code Playgroud)

十分简单.

  • 这工作惊人地快。我喜欢这个解决方案。我不得不做一些URL替换,而不是使用斜杠作为分隔符,而是使用管道(请阅读http://www.grymoire.com/Unix/Sed.html)。示例:sed -i's | http://olddomain.com | http://newdomain.com | g'./db.sql (2认同)
  • 提醒一下,在 OS X 中,`sed -i` 命令可能会抛出“未终止的替代模式”错误。您可以使用 `sed -i '' -e 's/oldString/newString/g' ./db.sql` 代替。 (2认同)

Lee*_*man 25

把它放在一个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']);
}
Run Code Online (Sandbox Code Playgroud)


小智 22

在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')
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的查询。对于我的WordPress网站,列名是`wp_posts`,因此查询看起来是``UPDATE`wp_posts` SET`post_content` = replace(post_content,'mysite.com/wordpress','mysite.com/news')'' (2认同)

Ume*_*til 8

 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);
Run Code Online (Sandbox Code Playgroud)

例如,如果我想用Mark替换所有出现的John,我会在下面使用,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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_%';
Run Code Online (Sandbox Code Playgroud)

这应该生成一个可以执行的更新语句列表.

  • 如果您有大量数据并且无法转储/重新加载,这是迄今为止最好的方法. (3认同)
  • 比倾销慢,但对于那些对命令行感到不舒服的人来说,这个答案是有创意和有效的. (2认同)

She*_*man 8

如果您确定要更新的字段均未序列化,则上述解决方案将发挥良好作用。

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

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

a:1:{s:13:"administrator";b:1;}
Run Code Online (Sandbox Code Playgroud)

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

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

wp-cli 上面的一些答案似乎特定于 WordPress 数据库,它序列化了大部分数据。WordPress 提供了一个命令行工具wp search-replace可以处理序列化。基本命令是:

a:1:{s:13:"administrator";b:1;}
Run Code Online (Sandbox Code Playgroud)

然而,WordPress 强调guid永远不应该更改,因此建议跳过该列。它还表明您经常想要跳过该wp_users表。看起来是这样的:

wp search-replace 'https://old-domain.example' '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 处。


小智 7

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

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

这个查询花费了大约一分钟,成功地取代的几千实例oldurl.extnewurl.ext列内post_content

phpMyAdmin 中查找和替换功能的屏幕截图

这种方法最好的一点是:您可以在提交之前检查每个匹配项。

注意我正在使用 phpMyAdmin 4.9.0.1

  • 这是我尝试过的唯一真正有效的方法! (2认同)