通常、phpmyadminを使用して、手動検索を使用してMySQLデータベースのテキストを置き換えます。もううんざりです。クエリを実行して、phpmyadminのテーブル全体でテキストを検索して新しいテキストに置き換えるにはどうすればよいですか?
例:キーワードを検索しdomain.com
、で置き換えwww.domain.com
ます。
通常、phpmyadminを使用して、手動検索を使用してMySQLデータベースのテキストを置き換えます。もううんざりです。クエリを実行して、phpmyadminのテーブル全体でテキストを検索して新しいテキストに置き換えるにはどうすればよいですか?
例:キーワードを検索し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
、バック、それをアップロードします。
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
私が見つけた最も簡単な方法は、データベースをテキストファイルにダンプし、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
簡単な簡単。
\/\/domain.com
sed -i
コマンドがunterminated substitute pattern
エラーをスローする可能性があることに注意してください。sed -i '' -e 's/oldString/newString/g' ./db.sql
代わりに使用できます。
これを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']);
}
PHPmyadminでSQLクエリを実行して、すべてのワードプレスブログ投稿内のテキストを検索および置換します。
UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
wp_posts
クエリが次のようになるUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
別のオプションは、データベースの各列のステートメントを生成することです:
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_%';
これにより、実行可能な更新ステートメントのリストが生成されます。
「スワプネシュ」の答えが一番だと思います!残念ながら、私は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`;
更新するフィールドがシリアル化されていない場合は、上記の解決策が適切に機能します。
ただし、更新が必要なフィールドのいずれかにシリアル化されたデータが含まれている場合、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です。
sqlファイルとしてエクスポートし、ビジュアルスタジオコードなどのエディターで開き、単語を見つけて再配置するのが最善です。合計14600ワードの16ワードを1ギグファイルsqlで1分で置き換えます。その最良の方法。置き換えた後、保存して再度インポートします。インポート用にzipで圧縮することを忘れないでください。
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 root -p your_db_name_here --force <upgrade_script.sql
大文字-小文字の文の場合、BINARY REPACEを使用できます。
UPDATE `table_1` SET `field_1` = BINARY REPLACE(`field_1`, 'find_string', 'replace_string')