通常我使用手動查找來使用phpmyadmin替換MySQL數據庫中的文本。我現在厭倦了它,我怎麼能運行一個查詢來查找並替換phpmyadmin中整個表中的新文本的文本?使用MySQL查詢在整個表中查找和替換文本
示例:查找關鍵字domain.com
,用www.domain.com
替換。
通常我使用手動查找來使用phpmyadmin替換MySQL數據庫中的文本。我現在厭倦了它,我怎麼能運行一個查詢來查找並替換phpmyadmin中整個表中的新文本的文本?使用MySQL查詢在整個表中查找和替換文本
示例:查找關鍵字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
,並將它上傳。
運行在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')
替換文本
把它放在一個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']);
}
UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);
像例如,如果我想馬克替換約翰所有出現下面我會使用,
UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
我發現最簡單的方法是將數據庫轉儲到文本文件,運行sed命令執行替換操作,然後將數據庫重新加載到MySQL中。
所有的命令都是在內存中的Linux上進行的。
轉儲數據庫,文本文件
mysqldump -u user -p databasename > ./db.sql
運行sed的命令來查找/替換目標字符串
sed -i 's/oldString/newString/g' ./db.sql
重裝數據庫到MySQL
mysql -u user -p databasename < ./db.sql
易peasy。
這個工作非常快。我喜歡這個解決方案。我不得不做一些URL替換,而不是使用斜槓作爲我的分隔符,而是使用了管道(請閱讀http://www.grymoire.com/Unix/Sed.html)。例如:sed -i's | http://olddomain.com | http://newdomain.com | g'./db.sql – 2015-02-09 04:49:21
它太快了,我認爲它沒有工作。但它確實! 此外,你可以像這樣轉義斜槓:'\/\/domain.com' – 2016-08-25 08:52:08
只需提醒一下,在OS X中,'sed -i'命令可能會拋出'未終止的替代模式'錯誤。您可以使用'sed -i''-e's/oldString/newString/g'。/ db.sql'。 – afterglowlee 2017-01-31 22:05:00
另一種選擇是生成報表的數據庫中的每個列:
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_%';
這應該生成更新語句,你就可以執行的列表。
我相信「swapnesh」答案是最好的!不幸的是,我不能在phpMyAdmin(4.5.0。2)誰雖然不合邏輯(並嘗試了幾件事)但它一直說一個新的聲明被發現,並且沒有發現任何分隔符...
因此,我提出了以下解決方案,如果您遇到同樣的問題,沒有其他對數據庫的訪問比PMA ...
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`;
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
nano upgrade_script.sql
的mysql -u根-p your_db_name_here --force < upgrade_script.sql
可能http://stackoverflow.com/questions/639531/mysql-search-的重複從數據庫中的每個表中都可以做到這一點 – sel 2012-08-07 04:05:28
你可以做一些像[this] [1]這樣的事情。 [1]:http://stackoverflow.com/questions/562457/search-for-all-occurrences-of-a-string-in-a-mysql-database/10182498#10182498 – Pramod 2013-04-16 06:50:41
[本](https://github.com/interconnectit/Search-Replace-DB)將幫助你實現你所需要的。 – Dom 2014-08-25 20:07:03