web-dev-qa-db-ja.com

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

通常、phpmyadminを使用してMySQLデータベース内のテキストを置き換えるために手動検索を使用します。今はうんざりしていますが、phpmyadminのテーブル全体でテキストを検索して新しいテキストに置き換える方法を教えてください。

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

207
alyasabrina

single tableアップデートの場合

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

multiple tables-から

すべてのテーブルから編集したい場合は、dump、次にfind/replaceの順に選択してアップロードするのが最善の方法です。

500
swapnesh

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

簡単です。

31
siliconrockstar

これを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']);
}
26
Lee Woodman

PHPmyadminでSQLクエリを実行して、mysite.com/wordpressを検索し、mysite.com/newsで置き換えるなど、すべてのWordpressブログ投稿のテキストを検索および置換します。この例の表はtj_postsです。

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
21
guest
 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');
8
Umesh Patil

もう1つの選択肢は、データベース内の各列に対してステートメントを生成することです。

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

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

7
Farid.O

私は「swapnesh」という回答が最善だと思います。残念ながら、私はそれをphpMyAdmin(4.5.0.2)で実行することができませんでしたが、それは論理的ではありませんが(そしていくつかのことを試みましたが)新しいステートメントが見つかったことを意味します。

したがって、私はあなたが同じ問題をexeprienceと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
llange

更新するフィールドがいずれもシリアル化されていないという確信がある場合、上記のソリューションはうまく機能します。

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

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

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

関連データの文字数は、データの一部としてエンコードされます。これは、「オブジェクト」をデータベースに簡単に保存できる形式に簡単に変換する方法です。 方法、理由、さまざまな方法の説明 を使用してオブジェクトデータをシリアル化します。 これは別の説明です 、ただし平易な言葉です。

MySQLにシリアル化されたデータを正しく処理するためのツールが組み込まれていれば驚くでしょうが、そうではありません。
(公平を期すために、前のリンクは、なぜそうするのが理にかなっていないのかを示しています。)

wp-cli
上記の回答の一部は、そのデータの多くをシリアル化するWordPressデータベースに固有のもののようです。 WordPressは、コマンドラインツール wp search-replace を提供し、そのdoesはシリアル化を処理します。
基本的なコマンドは次のとおりです。

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

1
SherylHohman

あなたはそれをSQLファイルとしてエクスポートし、ビジュアルスタジオコードのようなエディタでそれを開き、あなたの言葉を見つけて再配置するのが一番です。私は合計が14600ワードである16ワードのために1分で1ギグファイルのSQLに置き換えます。それが最善の方法です。そしてそれを交換した後に保存して再度インポートしてください。インポート用にZipで圧縮することを忘れないでください。

0
Omid Ahmadyani

変更SQL照会を生成する(FAST)

mysql -e "SELECT CONCAT( '更新'、テーブル名、 '設定'、列名、 '=置換('、列名、 '、' 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オプションを付けて生成されたスクリプトを実行します。 (SLOW - 大きいDBならコーヒーを買う)

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

0
Andy