Bir MySQL sorgusu kullanarak tüm tablodaki metni bulma ve değiştirme


235

Genellikle phpmyadmin kullanarak bir MySQL veritabanındaki metni değiştirmek için manual find kullanıyorum. Şimdi bıktım, nasıl phpmyadmin tüm tablodaki metni yeni bir metin bulmak ve değiştirmek için bir sorgu çalıştırabilirim?

Örnek: anahtar kelime bul domain.com, ile değiştir www.domain.com.



1
[This] [1] gibi bir şey yapabilirsiniz. [1]: stackoverflow.com/questions/562457/…
Pramod

2
Bu , ihtiyacınız olanı elde etmenize yardımcı olacaktır.
Dom

Yanıtlar:


551

Bir İçin single tablegüncelleme

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

Gönderen multiple tables-

Eğer tüm tablolardan düzenlemek istiyorsanız, en iyi yolu almaktır dumpve sonra find/replacegeri yükleyin.


4
Bu, tüm alanın yerini mi alıyor veya alanın içindeki bir alt dize eşleşiyor mu?
Randy Greencorn

3
@RandyGreencorn alanındaki bir alt dizenin yerini alacaktır. Ayrıca büyük / küçük harfe duyarlıdır.
Andrew

10
ve 'domain.com' yerine 'www.domain.com' ve 'www.domain.com' yerine '
www.www.domain.com

2
Bu konuda daha fazlası: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Bul / değiştir için çöplükte sed kullanın:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
Harika çalışıyor. Diğerlerinin belirttiği gibi, bazen phpMyAdmin'de çalışmak için tırnaklarla uğraşmak zorunda kalıyorum. Tam web adreslerini içeren bir sütunda yalnızca "http:" metnini "https:" ile değiştirmek için kullandım. Web adreslerinin geri kalanına dokunulmadı.
Heres2u

40

Bulduğum en kolay yol, veritabanını bir metin dosyasına dökmek, değiştirmek için bir sed komutu çalıştırmak ve veritabanını MySQL'e yeniden yüklemektir.

Aşağıdaki tüm komutlar Linux'ta kullanılır.

Veritabanını metin dosyasına dök

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

Hedef dizeyi bulmak / değiştirmek için sed komutunu çalıştırın

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

Veritabanını MySQL'e yeniden yükleyin

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

Tereyağından kıl çeker gibi.


2
Bu inanılmaz derecede hızlı çalışıyor. Bu çözümü seviyorum. Bazı url değiştirmeleri yapmak zorunda kaldım ve ayırıcılarım olarak eğik çizgiler kullanmak yerine bunun yerine borular kullandım (bunu grymoire.com/Unix/Sed.html okuyun ). Örnek: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy

1
İşe yaramadığını düşündüğüm çok hızlıydı. Ama oldu! Ayrıca, bunun gibi eğik çizgilerden kaçabilirsiniz:\/\/domain.com
m.cichacz

2
OS X'te sed -ikomutun unterminated substitute patternhata atabileceğini hatırlatmak isteriz . Bunun sed -i '' -e 's/oldString/newString/g' ./db.sqlyerine kullanabilirsiniz .
afterglowlee

25

Bunu bir php dosyasına koyun ve çalıştırın ve yapmasını istediğiniz şeyi yapmalısınız.

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

Benim için işe yaramadı, güzel bir öneri olsa - tatlı olurdu
AlexHighHigh

23

Mysite.com/wordpress bulma ve bunu mysite.com/news ile değiştirme gibi tüm wordpress blog yayınlarındaki metni bulmak ve değiştirmek için PHPmyadmin'de bir SQL sorgusu çalıştırma Bu örnekte tablo tj_posts

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

2
Sorgu için teşekkürler. WordPress sitem için sütun adı wp_postssorgusu görünüyorUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.

10

Başka bir seçenek, veritabanındaki her sütun için ifadeler oluşturmaktır:

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

Bu, daha sonra yürütebileceğiniz bir güncelleme deyimleri listesi oluşturmalıdır.


2
Çöplükten daha yavaş, ancak komut satırıyla rahat hissetmeyen insanlar için bu cevap yaratıcı ve etkilidir.
Stephane

3
Çok fazla veriye sahipseniz ve dökümü / yeniden yükleyemiyorsanız, bu en iyi yaklaşımdır.
Kariem

Ah adamım bu harika çalıştı! Senaryolarımı bu fikre dayanarak paylaşacağım
Andy

Bu yetersiz bir çözümdür. Tamamen benim için çalıştı.
rw-intechra

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

Örneğin, John'un tüm oluşumlarını Mark ile değiştirmek istersem, aşağıda kullanacağım,

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

3

phpMyAdmin temiz bir bul ve değiştir aracı içerir.

Tabloyu seçin, ardından Ara > Bul ve değiştir'e basın

Bu sorgu yaklaşık bir dakika sürdü ve başarıyla birkaç bin örneklerini arasında yerini oldurl.extile newurl.extSütun içindepost_content

phpMyAdmin'deki bul ve değiştir özelliğinin ekran görüntüsü

Bu yöntemle ilgili en iyi şey: Taahhüt etmeden önce her maçı kontrol etmelisiniz.

Not phpMyAdmin 4.9.0.1 kullanıyorum


2

"Swapnesh" cevabının en iyisi olduğuna inanıyorum! Ne yazık ki mantıksız (ve birkaç şey denedi) rağmen yeni bir ifade bulundu ve hiçbir sınırlayıcı bulunamadı söyleyerek tuttu phpMyAdmin (4.5.0.2) yürütmek olamazdı ...

Böylece ben aynı sorunu exeprience ve PMA daha veritabanına erişimi yoksa yararlı olabilir aşağıdaki çözüm ile geldi ...

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`;

Beklenen sonucu test etmek için kullanmak isteyebilirsiniz:

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

Güncellenecek alanların hiçbirinin serileştirilmediğinden eminseniz, yukarıdaki çözümler iyi çalışır.

Ancak, güncellenmesi gereken alanlardan herhangi biri serileştirilmiş veriler içeriyorsa, bir SQL Sorgusu veya bir döküm dosyasında basit bir arama / değiştirme, serileştirmeyi keser (değiştirilen dize, aranan dize ile aynı sayıda karaktere sahip değilse).

Emin olmak için, "serileştirilmiş" alan şöyle görünür:

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

İlgili verilerdeki karakter sayısı, verilerin bir parçası olarak kodlanır.
Serileştirme, "nesneleri" veritabanında kolayca saklanan bir biçime dönüştürmenin veya nesne verilerini farklı diller arasında kolayca taşımanın bir yoludur. Nesne verilerini serileştirmek için kullanılan farklı yöntemlerin
açıklaması ve neden bunu yapmak isteyebilirsiniz ve burada WordPress merkezli bir gönderi var: Seri Veri, Bu Ne Anlama Geliyor Ve Neden Bu Kadar Önemli? düz dilde.

MySQL, serileştirilmiş verileri otomatik olarak işlemek için bazı yerleşik araçlara sahip olsaydı şaşırtıcı olurdu, ancak bunu yapmaz ve farklı serileştirme formatları olduğundan, bunun için bir anlam ifade etmez.

wp-cli
Yukarıdaki yanıtlardan bazıları, verilerinin çoğunu serileştiren WordPress veritabanlarına özgü görünüyordu. WordPress bir komut satırı aracı sunar, arama-değiştirme wp ki yapar sap seri.
Temel bir komut:

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

Ancak, WordPress guidasla değiştirilmemesi gerektiğini vurgular , bu nedenle bu sütunun atlanmasını önerir.
Ayrıca, çoğu zaman wp_usersmasayı atlamak isteyeceğinizi de önerir .
İşte böyle görünecektir:

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

Not: --dry-runBayrağı ekledim, böylece bir kopyala yapıştır otomatik olarak kimsenin veritabanını bozmaz. Komut dosyasının istediğinizi yaptığından emin olduktan sonra, o bayrak olmadan tekrar çalıştırın.

Eklentiler
WordPress kullanıyorsanız, birçok ek özellik ile paketlenmiş bir gui arayüzü sunan birçok ücretsiz ve ticari eklenti de vardır.

Interconnect / bu php betiği
Interconnect / serileştirilmiş verileri işlemek için bir php betiği sunar: Güvenli Arama ve Değiştirme aracı. WordPress sitelerinde kullanılmak üzere oluşturuldu, ancak PHP tarafından serileştirilmiş herhangi bir veritabanında kullanılabileceği anlaşılıyor.
WordPress de dahil olmak üzere birçok şirket bu aracı önerir. Burada talimatlar , yaklaşık 3/4 sayfa aşağı.


1

en iyi sql dosyası olarak dışa aktarın ve visual studio kodu gibi editör ile açın ve kelimelerinizi bulun ve değiştirin. i toplam 14600 kelime 16 kelime için 1 dakika içinde 1 gig dosya sql değiştirin. onun en iyi yolu. ve değiştirdikten sonra kaydedin ve tekrar içe aktarın. ithalat için zip ile sıkıştırmayı unutmayın.


0

Değişiklik SQL sorguları oluşturma (FAST)

mysql -e "SELECT CONCAT ('güncelleme', tablo_adı, 'set', sütun_adı, '= değiştir (', sütun_adı, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') AS deyimi FROM information_schema.columns NEREDE table_name LIKE' wp_% '"-u root -p sizin_db_name_here> upgrade_script.sql

Dosyanın başlangıcındaki çöpleri kaldırın. Biraz aldım.

nano upgrade_script.sql

Hataları atlamak için oluşturulan komut dosyasını --force seçenekleriyle çalıştırın. (YAVAŞ - büyük DB ise bir kahve al)

mysql -u root -p dosya_db_ismi_bölüm --force <upgrade_script.sql


0

Büyük - küçük harf içeren cümleler durumunda, İKİLİ REPACE kullanabiliriz

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.