问答中心分类: MYSQL使用MySQL查询查找并替换整个表中的文本
0
匿名用户 提问 18小时 前

通常我使用phpmyadmin手动查找来替换MySQL数据库中的文本。我现在已经厌倦了,如何在phpmyadmin中运行查询来查找整个表中的文本并将其替换为新文本?
示例:查找关键字domain.com,替换为www.domain.com.

13 Answers
0
siliconrockstar 回答 18小时 前

我找到的最简单的方法是将数据库转储到文本文件中,运行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

简单的豌豆。

Mike Kormendy 回复 18小时 前

这工作速度惊人。我喜欢这个解决方案。我不得不做一些url替换,而不是使用斜杠作为分隔符,而是使用管道(请阅读本文)格里摩尔。com/Unix/Sed。html). 例子:sed -i 's|http://olddomain.com|http://newdomain.com|g' ./db.sql

m.cichacz 回复 18小时 前

它跑得太快了,我以为它没用。但它做到了!此外,您可以像这样避开斜杠:\/\/domain.com

afterglowlee 回复 18小时 前

提醒您,在OS X中sed -i命令可能会抛出unterminated substitute pattern错误您可以使用sed -i '' -e 's/oldString/newString/g' ./db.sql相反

David N 回复 18小时 前

那太好了。我有一个小备份,因为我们永远不知道,就在mysqldump之后:cp-dl。sql数据库。sqlBACK

0
Lee Woodman 回答 18小时 前

把它放在一个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']);
}
AlexHighHigh 回复 18小时 前

这对我来说并不管用,不过这是一个很好的建议——那会很好的

Harkály Gergő 回复 18小时 前

根据评论,这是WordPress与mysqli的简单解决方案:$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); $mysqli->set_charset('utf8mb4'); $find = "old"; $replace = "new"; $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 = '".DB_NAME."'"; $loop = $mysqli->query($query) or die ('Cant loop through dbfields: ' . $mysqli->error()); while ($query = $loop->fetch_assoc()) { $mysqli->query($query['s']); }

0
guest 回答 18小时 前

在PHPmyadmin中运行SQL查询以查找和替换所有wordpress博客文章中的文本,例如查找mysite。com/wordpress,并将其替换为mysite。com/新闻

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B. 回复 18小时 前

感谢您的查询。对于我的WordPress站点,列名为wp_posts所以查询看起来UPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')

0
youtag 回答 18小时 前

phpMyAdmin包括一个整洁的查找和替换工具。
选择表格,然后点击搜索>查找并替换
此查询耗时约一分钟,成功替换了oldurl.ext使用newurl.ext在列内post_content
phpMyAdmin中查找和替换功能的屏幕截图
这种方法最好的地方是:在提交之前检查每个匹配项。
N、 B.我使用的是phpMyAdmin 4.9.0.1

InterLinked 回复 18小时 前

这是我尝试过的唯一有效的方法!

0
Farid.O 回答 18小时 前

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

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语句列表,然后您可以执行这些语句。

Stephane 回复 18小时 前

比转储慢,但对于那些对命令行感到不舒服的人来说,这个答案是有创意和有效的。

Kariem 回复 18小时 前

如果您有大量数据并且无法转储/重新加载数据,那么这是目前为止最好的方法。

Andy 回复 18小时 前

哦,老兄,这真是太棒了!我将根据这个想法分享我的脚本

rw-intechra 回复 18小时 前

这是一个被低估的解决方案。完全对我有用。