MySQLクエリを使用してテーブル全体のテキストを検索して置換する


235

通常、phpmyadminを使用して、手動検索を使用してMySQLデータベースのテキストを置き換えます。もううんざりです。クエリを実行して、phpmyadminのテーブル全体でテキストを検索して新しいテキストに置き換えるにはどうすればよいですか?

例:キーワードを検索しdomain.com、で置き換えwww.domain.comます。


可能性のある重複stackoverflow.com/questions/639531/...
SEL

1
[this] [1]のようなことができます。[1]:stackoverflow.com/questions/562457/...
Pramodさん

2
これは、必要なものを達成するのに役立ちます。
Dom

回答:


551

以下のためのsingle tableアップデート

 UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')

からmultiple tables-

あなたはすべてのテーブルから編集したい場合は、最良の方法は取ることですdumpし、その後find/replace、バック、それをアップロードします。


4
これはフィールド全体を置き換えますか、それともフィールド内の部分文字列の一致を行いますか?
ランディグリーンコーン2013年

3
@RandyGreencornフィールド内の部分文字列を置き換えます。また、大文字と小文字が区別されます。
Andrew

10
そして、「domain.com」を「www.domain.com」に、「www.domain.com」を「www.www.domain.com」に置き換えます
michelek

2
詳細:If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.ダンプでsedを使用して検索/置換:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
よく働く。他の人が述べたように、phpMyAdminで機能させるために引用符をいじる必要がある場合があります。完全なWebアドレスを含む列の「http:」というテキストのみを「https:」に置き換えるために使用しました。残りのWebアドレスは変更されていません。
Heres2u

40

私が見つけた最も簡単な方法は、データベースをテキストファイルにダンプし、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

簡単な簡単。


2
これは驚くほど速く動作します。このソリューションが大好きです。いくつかのURL置換を行う必要があり、区切り文字としてスラッシュを使用する代わりに、代わりにパイプを使用しました(これをgrymoire.com/Unix/Sed.htmlで読んでください)。例:sed -i 's | olddomain.com | http://newdomain.com | g './db.sql
Mike Kormendy

1
とても速かったので動かないと思いました。しかし、そうなった!:また、あなたはちょうどこのようなスラッシュエスケープすることができます\/\/domain.com
m.cichacz

2
OS Xでは、sed -iコマンドがunterminated substitute patternエラーをスローする可能性があることに注意してください。sed -i '' -e 's/oldString/newString/g' ./db.sql代わりに使用できます。
afterglowlee 2017年

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']);
}

私にとってはうまく
いき

23

PHPmyadminでSQLクエリを実行して、すべてのワードプレスブログ投稿内のテキストを検索および置換します。

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')

2
お問い合わせありがとうございます。私のWordPressサイトの場合、列名はwp_postsクエリが次のようになるUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
マリスB.

10

別のオプションは、データベースの各列のステートメントを生成することです:

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_%';

これにより、実行可能な更新ステートメントのリストが生成されます。


2
ダンプよりも遅いですが、コマンドラインに慣れていない人にとって、この答えは創造的で効果的です。
ステファン

3
大量のデータがあり、それをダンプ/リロードできない場合、これは断然最良のアプローチです。
Kariem

ああ、これはうまくいった!このアイデアに基づいて自分のスクリプトを共有します
Andy

これは過小評価されたソリューションです。完全に私のために働きました。
rw-intechra

8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

たとえば、Johnのすべての出現箇所をMarkで置き換えたい場合は、以下を使用します。

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');

3

phpMyAdminには、きちんとした検索と置換ツールが含まれています。

テーブルを選択し、[ 検索] > [ 検索と置換]をクリックします

このクエリは、分程度かかりましたし、成功した数千のインスタンスを置き換えoldurl.extnewurl.extカラム内post_content

phpMyAdminの検索および置換機能のスクリーンショット

この方法の最大の利点は、コミットする前にすべての一致を確認できることです。

注意:私はphpMyAdmin 4.9.0.1を使用しています


2

「スワプネシュ」の答えが一番だと思います!残念ながら、私は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`;

2

更新するフィールドがシリアル化されていない場合は、上記の解決策が適切に機能します。

ただし、更新が必要なフィールドのいずれかにシリアル化されたデータが含まれている場合、SQLクエリまたはダンプファイルの単純な検索/置換は、シリアル化を解除します(置換された文字列が検索された文字列と正確に同じ文字数でない限り)。

確かに、「シリアル化された」フィールドは次のようになります。

a:1:{s:13:"administrator";b:1;}  

関連データの文字数は、データの一部としてエンコードされます。
シリアライゼーションは、「オブジェクト」をデータベースに簡単に保存できる形式に変換する方法、または異なる言語間でオブジェクトデータを簡単に転送する方法です。オブジェクトデータをシリアル化するために使用されるさまざまなメソッドの
説明と、なぜそうする必要があるのか​​を次に示します。WordPress中心の投稿:シリアル化されたデータ、それは何を意味し、なぜそれほど重要なのですか?わかりやすい言葉で。

MySQLにシリアル化されたデータを自動的に処理するための組み込みツールがあったとしても驚くべきことですが、そうではありません。異なるシリアル化フォーマットがあるため、そうすることは意味がありません。

wp-cli
上記の回答の一部は、データの多くをシリアル化するWordPressデータベースに固有のように見えました。WordPressのはコマンドラインツールを提供しています、検索・置換するWPこと、ありませんハンドルのシリアル化を。
基本的なコマンドは次のとおりです。

    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スクリプトを提供します:Safe Search and Replaceツール。WordPressサイトで使用するために作成されましたが、PHPによってシリアル化されたどのデータベースでも使用できるようです。
WordPress自体を含む多くの企業がこのツールを推奨しています。ここでの説明は、ページの約3/4です。


1

sqlファイルとしてエクスポートし、ビジュアルスタジオコードなどのエディターで開き、単語を見つけて再配置するのが最善です。合計14600ワードの16ワードを1ギグファイルsqlで1分で置き換えます。その最良の方法。置き換えた後、保存して再度インポートします。インポート用にzipで圧縮することを忘れないでください。


0

変更SQLクエリの生成(FAST)

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

--forceオプションを指定して生成されたスクリプトを実行し、エラーをスキップします。(スロー-大きなDBの場合はコーヒーを飲みます)

mysql -u root -p your_db_name_here --force <upgrade_script.sql


0

大文字-小文字の文の場合、BINARY REPACEを使用できます。

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.