Temukan dan Ganti teks di seluruh tabel menggunakan kueri MySQL

235

Biasanya saya menggunakan pencarian manual untuk mengganti teks dalam database MySQL menggunakan phpmyadmin. Saya sudah bosan sekarang, bagaimana saya bisa menjalankan kueri untuk menemukan dan mengganti teks dengan teks baru di seluruh tabel di phpmyadmin?

Contoh: cari kata kunci domain.com, ganti dengan www.domain.com.

alyasabrina
sumber
Kemungkinan duplikat stackoverflow.com/questions/639531/…
sel
1
Anda dapat melakukan beberapa hal seperti [ini] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod
2
Ini akan membantu Anda mencapai apa yang Anda butuhkan.
Dom
Kemungkinan duplikat penggantian string MySQL
Steve Chambers

Jawaban:

551

Untuk single tablepembaruan

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

Dari multiple tables-

Jika Anda ingin mengedit dari semua tabel, cara terbaik adalah mengambil dumpdan kemudian find/replacemengunggahnya kembali.

swapnesh
sumber
4
Apakah ini mengganti seluruh bidang, atau dengan itu melakukan pencocokan substring dalam bidang?
Randy Greencorn
3
Ini akan menggantikan substring dalam bidang @RandyGreencorn. Ini juga case-sensitive.
Andrew
10
dan itu akan menggantikan 'domain.com' dengan 'www.domain.com' dan 'www.domain.com' dengan 'www.www.domain.com'
michelek
2
Lebih lanjut tentang ini: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Gunakan sed pada dump untuk menemukan / mengganti:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma
2
Bagus sekali. Seperti yang telah dinyatakan orang lain, kadang-kadang saya harus mengacaukan dengan kutipan untuk membuatnya bekerja di phpMyAdmin. Saya menggunakannya untuk mengganti hanya teks "http:" dengan "https:" di kolom yang berisi alamat web lengkap. Alamat web lainnya tidak tersentuh.
Heres2u
40

Cara termudah yang saya temukan adalah membuang database ke file teks, menjalankan perintah sed untuk melakukan penggantian, dan memuat kembali database ke MySQL.

Semua perintah di bawah ini adalah bash di Linux.

Buang database ke file teks

mysqldump -u user -p databasename > ./db.sql

Jalankan perintah sed untuk menemukan / mengganti string target

sed -i 's/oldString/newString/g' ./db.sql

Muat ulang basis data ke dalam MySQL

mysql -u user -p databasename < ./db.sql

Peasy mudah.

siliconrockstar
sumber
2
Ini bekerja sangat cepat. Saya suka solusi ini. Saya harus melakukan beberapa penggantian url dan alih-alih menggunakan garis miring sebagai pembatas, saya menggunakan pipa (baca ini grymoire.com/Unix/Sed.html ). Contoh: sed -i's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy
1
Itu sangat cepat saya pikir itu tidak berhasil. Tapi ternyata berhasil! Anda juga dapat melarikan diri dari tebasan seperti ini:\/\/domain.com
m.cichacz
2
Hanya pengingat bahwa di OS X, sed -iperintah dapat membuang unterminated substitute patternkesalahan. Anda bisa menggunakannya sed -i '' -e 's/oldString/newString/g' ./db.sql.
afterglowlee
25

Letakkan ini di file php dan jalankan dan itu harus melakukan apa yang Anda inginkan.

// 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']);
}
Lee Woodman
sumber
Tidak bekerja untuk saya, saran yang bagus - pasti manis
AlexHighHigh
23

Menjalankan kueri SQL dalam PHPmyadmin untuk menemukan dan mengganti teks di semua posting blog wordpress, seperti menemukan mysite.com/wordpress dan menggantinya dengan mysite.com/news Tabel dalam contoh ini adalah tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
tamu
sumber
2
Terima kasih untuk pertanyaannya. Untuk situs WordPress saya, nama kolomnya wp_postssangat mirip dengan kueriUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.
10

Pilihan lain adalah membuat pernyataan untuk setiap kolom dalam database:

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

Ini akan menghasilkan daftar pernyataan pembaruan yang dapat Anda jalankan.

Farid.O
sumber
2
Lebih lambat dari dumping, tetapi bagi orang yang tidak merasa nyaman dengan baris perintah, jawaban ini kreatif dan efektif.
Stephane
3
Sejauh ini, ini adalah pendekatan terbaik, jika Anda memiliki banyak data dan tidak dapat membuang / memuatnya.
Kariem
Ya ampun ini berhasil! Saya akan membagikan skrip saya berdasarkan ide ini
Andy
Ini adalah solusi yang diremehkan. Benar-benar bekerja untuk saya.
rw-intechra
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Seperti misalnya, jika saya ingin mengganti semua kemunculan John dengan Mark, saya akan menggunakan di bawah ini,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Umesh Patil
sumber
3

phpMyAdmin termasuk alat temukan dan ganti yang rapi.

Pilih tabel, lalu tekan Cari > Cari dan ganti

Permintaan ini memakan waktu sekitar satu menit dan berhasil menggantikan beberapa ribu contoh oldurl.extdengan newurl.extdalam Kolompost_content

tangkapan layar fitur temukan-dan-ganti di phpMyAdmin

Hal terbaik tentang metode ini: Anda bisa memeriksa setiap pertandingan sebelum melakukan.

NB Saya menggunakan phpMyAdmin 4.9.0.1

youtag
sumber
2

Saya percaya jawaban "swapnesh" menjadi yang terbaik! Sayangnya saya tidak dapat menjalankannya di phpMyAdmin (4.5.0.2) yang walaupun tidak logis (dan mencoba beberapa hal) tetap mengatakan bahwa pernyataan baru ditemukan dan tidak ada pembatas yang ditemukan ...

Jadi saya datang dengan solusi berikut yang mungkin berguna jika Anda mengalami masalah yang sama dan tidak memiliki akses lain ke database selain 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`;

Untuk menguji hasil yang diharapkan, Anda mungkin ingin menggunakan:

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`;
llange
sumber
2

Jika Anda yakin bahwa tidak ada bidang yang diperbarui adalah serial, solusi di atas akan berfungsi dengan baik.

Namun, jika salah satu bidang yang perlu diperbarui berisi data serial, SQL Query atau pencarian / penggantian sederhana pada file dump, akan memutus serialisasi (kecuali string yang diganti memiliki jumlah karakter yang persis sama dengan string yang dicari).

Yang pasti, bidang "serial" terlihat seperti ini:

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

Jumlah karakter dalam data yang relevan dikodekan sebagai bagian dari data.
Serialisasi adalah cara untuk mengubah "objek" ke dalam format yang mudah disimpan dalam database, atau untuk dengan mudah mengangkut data objek antara berbagai bahasa.
Berikut adalah penjelasan tentang berbagai metode yang digunakan untuk membuat serialisasi data objek, dan mengapa Anda mungkin ingin melakukannya, dan di sini ada posting WordPress-centric: Data Serialized, Apa Artinya Dan Mengapa begitu penting? dalam bahasa sederhana.

Akan luar biasa jika MySQL memiliki beberapa alat bawaan untuk menangani data serial secara otomatis, tetapi tidak, dan karena ada berbagai format serialisasi, bahkan tidak masuk akal untuk melakukannya.

wp-cli
Beberapa jawaban di atas tampak spesifik untuk database WordPress, yang membuat serialisasi banyak datanya. WordPress menawarkan alat baris perintah, WP mencari-ganti , yang tidak menangani serialisasi.
Perintah dasar adalah:

    wp search-replace 'an-old-string' 'a-new-string' --dry-run

Namun, WordPress menekankan bahwa hal guiditu tidak boleh diubah , jadi disarankan untuk melewatkan kolom itu.
Ini juga menunjukkan bahwa sering kali Anda ingin melewati wp_usersmeja.
Ini akan terlihat seperti apa:

wp search-replace 'https://old-domain.com' 'https://shiney-new-domain.com' --skip-columns=guid --skip-tables=wp_users --dry-run

Catatan: Saya menambahkan --dry-runflag sehingga copy-paste tidak akan secara otomatis merusak database siapa pun. Setelah Anda yakin skrip melakukan apa yang Anda inginkan, jalankan kembali tanpa bendera itu.

Plugin
Jika Anda menggunakan WordPress, ada juga banyak plugin gratis dan komersial yang menawarkan antarmuka gui untuk melakukan hal yang sama, dikemas dengan banyak fitur tambahan.

Interconnect / itu skrip php
Interconnect / itu menawarkan skrip php untuk menangani data serial: alat Safe Search and Replace . Itu dibuat untuk digunakan di situs WordPress, tetapi sepertinya itu dapat digunakan pada basis data apa pun yang diserialisasi oleh PHP.
Banyak perusahaan, termasuk WordPress sendiri, merekomendasikan alat ini. Instruksi di sini, sekitar 3/4 di halaman.

SherylHohman
sumber
1

terbaik Anda mengekspornya sebagai file sql dan membukanya dengan editor seperti kode studio visual dan menemukan dan mengganti kata-kata Anda. saya ganti dalam 1 gig file sql dalam 1 menit selama 16 kata yang totalnya 14600 kata. ini cara terbaik. dan setelah menggantinya simpan dan impor lagi. jangan lupa kompres dengan zip untuk impor.

Omid Ahmadyani
sumber
0

Hasilkan perubahan kueri SQL (FAST)

mysql -e "SELECT CONCAT ('update', table_name, 'set', column_name, '= ganti (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') SEBAGAI pernyataan DARI informasi_schema.kolom WHERE table_name SUKA' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Hapus semua sampah di awal file. Saya punya beberapa.

nano upgrade_script.sql

Jalankan skrip yang dibuat dengan opsi --force untuk melewati kesalahan. (PERLAHAN - ambil kopi jika DB besar)

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

Andy
sumber
0

Dalam kasus kalimat dengan huruf besar - kecil, Kita dapat menggunakan BINARY REPACE

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Ho Vng Tgtt
sumber