Znajdź i zamień tekst w całej tabeli za pomocą zapytania MySQL


235

Zwykle używam ręcznego wyszukiwania do zamiany tekstu w bazie danych MySQL przy użyciu phpmyadmin. Mam tego dość, jak mogę uruchomić zapytanie w celu znalezienia i zastąpienia tekstu nowym tekstem w całej tabeli w phpmyadmin?

Przykład: znajdź słowo kluczowe domain.com, zamień na www.domain.com.



1
Możesz zrobić coś takiego [to] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod 16.04.13

2
To pomoże Ci osiągnąć to, czego potrzebujesz.
Dom

Odpowiedzi:


551

Do single tableaktualizacji

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

Od multiple tables-

Jeśli chcesz edytować ze wszystkich tabel, najlepszym sposobem jest pobranie, dumpa następnie find/replaceprzesłanie go z powrotem.


4
Czy to zastępuje całe pole, czy też dopasowuje podciąg w polu?
Randy Greencorn,

3
Zastąpi podciąg w polu @RandyGreencorn. Rozróżnia również wielkość liter.
Andrew

10
i zamieni „domena.com” na „www.domain.com” i „www.domain.com” na „
www.www.domain.com

2
Więcej na ten temat: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Użyj sed na zrzucie, aby znaleźć / zamienić:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
Działa świetnie. Jak powiedzieli inni, czasami muszę zadzierać z cytatami, aby działał w phpMyAdmin. Użyłem go, aby zamienić tylko tekst „http:” na „https:” w kolumnie zawierającej pełne adresy internetowe. Pozostałe adresy internetowe pozostały nietknięte.
Heres2u,

40

Najprostszym sposobem, jaki znalazłem, jest zrzucenie bazy danych do pliku tekstowego, uruchomienie komendy sed w celu wykonania zamiany i ponowne załadowanie bazy danych z powrotem do MySQL.

Wszystkie poniższe polecenia są bash na Linuksie.

Zrzuć bazę danych do pliku tekstowego

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

Uruchom komendę sed, aby znaleźć / zamienić ciąg docelowy

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

Załaduj ponownie bazę danych do MySQL

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

Bułka z masłem.


2
Działa to niesamowicie szybko. Uwielbiam to rozwiązanie. Musiałem zrobić kilka zmian adresu URL i zamiast używać ukośników jako moich ograniczników, zamiast tego użyłem potoków (przeczytaj to grymoire.com/Unix/Sed.html ). Przykład: sed -i's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy

1
Było tak szybko, że myślałem, że to nie działa. Ale tak się stało! Ponadto możesz po prostu uciec przed ukośnikami w następujący sposób:\/\/domain.com
m.cichacz

2
Przypominamy, że w OS X sed -ipolecenie może wyrzucić unterminated substitute patternbłąd. Zamiast tego możesz użyć sed -i '' -e 's/oldString/newString/g' ./db.sql.
afterglowlee

25

Umieść to w pliku php i uruchom go, a powinien zrobić to, co chcesz.

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

Nie działało dla mnie, ale miła sugestia - byłoby słodko
AlexHighHigh

23

Uruchomienie zapytania SQL w PHPmyadmin w celu znalezienia i zastąpienia tekstu we wszystkich postach na blogach wordpress, takich jak znalezienie mysite.com/wordpress i zastąpienie go mysite.com/news Tabela w tym przykładzie to tj_posts

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

2
Dzięki za zapytanie. W przypadku mojej witryny WordPress nazwa kolumny wygląda wp_poststak, jak wygląda zapytanieUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.,

10

Inną opcją jest wygenerowanie instrukcji dla każdej kolumny w bazie danych:

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

Powinno to wygenerować listę instrukcji aktualizacji, które można następnie wykonać.


2
Wolniej niż zrzut, ale dla osób, które nie czują się komfortowo z linii poleceń, ta odpowiedź jest kreatywna i skuteczna.
Stephane

3
Jest to zdecydowanie najlepsze podejście, jeśli masz dużo danych i nie możesz ich zrzucić / załadować ponownie.
Kariem

O rany, to działało świetnie! Podzielę się swoimi skryptami opartymi na tym pomyśle
Andy

To niedoceniane rozwiązanie. Totally dla mnie pracował.
rw-intechra

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

Na przykład, jeśli chcę zastąpić wszystkie wystąpienia Johna znakiem Marka, użyję poniżej,

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

3

phpMyAdmin zawiera zgrabne narzędzie do znajdowania i zastępowania.

Wybierz tabelę, a następnie kliknij Szukaj > Znajdź i zamień

To zapytanie trwało około minuty i z powodzeniem zastąpić kilka tysięcy przypadków oldurl.extz newurl.extwewnątrz kolumnypost_content

zrzut ekranu funkcji znajdź i zamień w phpMyAdmin

Najlepsza rzecz w tej metodzie: przed zatwierdzeniem musisz sprawdzić każdy mecz.

NB Używam phpMyAdmin 4.9.0.1


2

Uważam, że odpowiedź „swapnesh” jest najlepsza! Niestety nie mogłem go wykonać w phpMyAdmin (4.5.0.2), który chociaż nielogiczny (i próbował kilku rzeczy) ciągle powtarzał, że znaleziono nową instrukcję i że nie znaleziono separatora…

Tak więc znalazłem następujące rozwiązanie, które może być przydatne, jeśli doświadczasz tego samego problemu i nie masz innego dostępu do bazy danych niż 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`;

Aby przetestować oczekiwany wynik, możesz użyć:

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

Jeśli masz pewność, że żadne z pól, które mają zostać zaktualizowane, nie są serializowane, powyższe rozwiązania będą działać dobrze.

Jeśli jednak którekolwiek z pól wymagających aktualizacji zawiera dane zserializowane, zapytanie SQL lub proste wyszukiwanie / zamiana w pliku zrzutu spowoduje przerwanie serializacji (chyba że zastąpiony ciąg ma dokładnie taką samą liczbę znaków jak szukany ciąg).

Dla pewności pole „zserializowane” wygląda następująco:

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

Liczba znaków w odpowiednich danych jest kodowana jako część danych.
Serializacja to sposób na konwersję „obiektów” na format łatwo przechowywany w bazie danych lub na łatwy transport danych obiektów między różnymi językami.
Oto wyjaśnienie różnych metod serializacji danych obiektowych i dlaczego warto to zrobić, a oto post skoncentrowany na WordPress: Dane szeregowe, co to znaczy i dlaczego jest tak ważny? prostym językiem.

Byłoby niesamowite, gdyby MySQL miał wbudowane narzędzie do automatycznej obsługi danych serializowanych, ale tak nie jest, a ponieważ istnieją różne formaty serializacji, nie miałoby to nawet sensu.

wp-cli
Niektóre z powyższych odpowiedzi wydawały się specyficzne dla baz danych WordPress, które serializują większość jego danych. WordPress oferuje narzędzie linii poleceń, WP szukać zamień , że ma uchwyt serializacji.
Podstawowym poleceniem byłoby:

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

WordPress podkreśla jednak, że guidnigdy nie należy go zmieniać , dlatego zaleca pominięcie tej kolumny.
Sugeruje również, że często będziesz chciał pominąć wp_usersstół.
Oto jak by to wyglądało:

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

Uwaga: dodałem --dry-runflagę, aby kopiowanie-wklejanie nie zniszczyło automatycznie bazy danych nikogo. Po upewnieniu się, że skrypt robi to, co chcesz, uruchom go ponownie bez tej flagi.

Wtyczki
Jeśli korzystasz z WordPress, istnieje również wiele bezpłatnych i komercyjnych wtyczek, które oferują interfejs GUI, aby zrobić to samo, wyposażone w wiele dodatkowych funkcji.

Interconnect / it skrypt php
Interconnect / oferuje skrypt php do obsługi danych zserializowanych: narzędzie Bezpieczne wyszukiwanie i zamiana . Został stworzony do użytku na stronach WordPress, ale wygląda na to, że można go użyć w dowolnej bazie danych zserializowanej przez PHP.
Wiele firm, w tym sam WordPress, poleca to narzędzie. Instrukcje tutaj, około 3/4 w dół strony.


1

najlepiej wyeksportuj go jako plik sql i otwórz go za pomocą edytora, takiego jak kod Visual Studio, i znajdź i odmień swoje słowa. Zamieniam w 1 gig pliku sql w 1 minutę na 16 słów, które łącznie to 14600 słów. to najlepszy sposób. a po wymianie zapisz i zaimportuj ponownie. nie zapomnij skompresować go za pomocą zip do importu.


0

Generuj zmiany zapytań SQL (FAST)

mysql -e "SELECT CONCAT ('aktualizacja', nazwa_tabeli, 'set', nazwa_kolumny, '= replace (', nazwa_kolumny, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Instrukcja AS z schematu_informacyjnego.kolumny GDZIE nazwa_tabeli PODOBNE' wp_% '"-u root -p nazwa_bazy_db_there> upgrade_script.sql

Usuń wszelkie śmieci na początku pliku. Miałem trochę.

nano upgrade_script.sql

Uruchom wygenerowany skrypt z opcjami --force, aby pominąć błędy. (WOLNO - weź kawę, jeśli duży DB)

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


0

W przypadku zdań z dużymi i małymi literami, możemy użyć PRZESUNIĘCIA BINARNEGO

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.