Suchen und Ersetzen von Text in der gesamten Tabelle mithilfe einer MySQL-Abfrage


235

Normalerweise verwende ich die manuelle Suche, um Text in einer MySQL-Datenbank mit phpmyadmin zu ersetzen. Ich habe es jetzt satt, wie kann ich eine Abfrage ausführen, um einen Text in der gesamten Tabelle in phpmyadmin zu finden und durch neuen Text zu ersetzen?

Beispiel: Schlüsselwort suchen domain.com, durch ersetzen www.domain.com.


Mögliches Duplikat von stackoverflow.com/questions/639531/…
sel

1
Sie können so etwas wie [dies] [1] tun. [1]: stackoverflow.com/questions/562457/…
Pramod

2
Dies wird Ihnen helfen, das zu erreichen, was Sie brauchen.
Dom

Mögliches Duplikat der MySQL-Zeichenfolge ersetzen
Steve Chambers

Antworten:


551

Für ein single tableUpdate

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

Von multiple tables-

Wenn Sie aus allen Tabellen bearbeiten möchten, nehmen Sie am besten das dumpund dann find/replaceund laden Sie es zurück.


4
Ersetzt dies ein ganzes Feld oder stimmt damit ein Teilstring innerhalb eines Feldes überein?
Randy Greencorn

3
Es ersetzt eine Teilzeichenfolge im Feld @RandyGreencorn. Es wird auch zwischen Groß- und Kleinschreibung unterschieden.
Andrew

10
und es wird 'domain.com' durch 'www.domain.com' und 'www.domain.com' durch 'www.wainw.domain.com'
ersetzen

2
Mehr dazu: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Verwenden Sie sed auf der Müllkippe für das Finden / Ersetzen:sed "s:unwanted_text:wanted_text:g" dump.sql
Kakoma

2
Funktioniert super. Wie andere gesagt haben, muss ich manchmal mit den Anführungszeichen herumspielen, damit es in phpMyAdmin funktioniert. Ich habe es verwendet, um nur den Text "http:" durch "https:" in einer Spalte mit vollständigen Webadressen zu ersetzen. Die restlichen Webadressen blieben unberührt.
Heres2u

40

Der einfachste Weg, den ich gefunden habe, besteht darin, die Datenbank in eine Textdatei zu kopieren, einen sed-Befehl auszuführen, um das Ersetzen durchzuführen, und die Datenbank wieder in MySQL zu laden.

Alle folgenden Befehle sind Bash unter Linux.

Datenbank in Textdatei sichern

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

Führen Sie den Befehl sed aus, um die Zielzeichenfolge zu finden / ersetzen

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

Laden Sie die Datenbank neu in MySQL

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

Kinderleicht.


2
Das geht erstaunlich schnell. Ich liebe diese Lösung. Ich musste einige URL-Ersetzungen vornehmen und anstatt Schrägstriche als Begrenzer zu verwenden, verwendete ich stattdessen Pipes (lesen Sie dies unter grymoire.com/Unix/Sed.html ). Beispiel: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy

1
Es war so schnell, dass ich dachte, es würde nicht funktionieren. Aber es tat es! Sie können auch einfach Schrägstrichen wie diesen entkommen:\/\/domain.com
m.cichacz

2
Nur eine Erinnerung daran, dass der sed -iBefehl in OS X möglicherweise einen unterminated substitute patternFehler auslöst. Sie können sed -i '' -e 's/oldString/newString/g' ./db.sqlstattdessen verwenden.
Afterglowlee

25

Legen Sie dies in eine PHP-Datei und führen Sie es aus und es sollte tun, was Sie wollen, dass es tun soll.

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

Hat bei mir nicht funktioniert, aber netter Vorschlag - wäre süß gewesen
AlexHighHigh

23

Das Ausführen einer SQL-Abfrage in PHPmyadmin zum Suchen und Ersetzen von Text in allen WordPress-Blog-Posts, z. B. das Suchen von mysite.com/wordpress und das Ersetzen durch mysite.com/news Die Tabelle in diesem Beispiel lautet tj_posts

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

2
Danke für die Anfrage. Für meine WordPress-Site ist der Spaltenname wp_postsso, dass die Abfrage aussiehtUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.

10

Eine andere Möglichkeit besteht darin, die Anweisungen für jede Spalte in der Datenbank zu generieren:

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

Dies sollte eine Liste von Aktualisierungsanweisungen generieren, die Sie dann ausführen können.


2
Langsamer als Dumping, aber für Leute, die sich mit der Befehlszeile nicht wohl fühlen, ist diese Antwort kreativ und effektiv.
Stephane

3
Dies ist bei weitem der beste Ansatz, wenn Sie viele Daten haben und diese nicht sichern / neu laden können.
Kariem

Oh man das hat super geklappt! Ich werde meine Skripte basierend auf dieser Idee teilen
Andy

Dies ist eine unterschätzte Lösung. Total für mich gearbeitet.
rw-intechra

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

Wie zum Beispiel, wenn ich alle Vorkommen von John durch Mark ersetzen möchte, werde ich unten verwenden,

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

3

phpMyAdmin enthält ein übersichtliches Tool zum Suchen und Ersetzen.

Wählen Sie die Tabelle aus und klicken Sie auf Suchen > Suchen und Ersetzen

Diese Abfrage dauerte etwa eine Minute und erfolgreich ersetzt mehrere tausend Instanzen oldurl.extmit dem newurl.extin Spaltepost_content

Screenshot der Funktion zum Suchen und Ersetzen in phpMyAdmin

Das Beste an dieser Methode: Sie können jedes Spiel vor dem Festschreiben überprüfen.

NB Ich verwende phpMyAdmin 4.9.0.1


2

Ich glaube, "swapnesh" Antwort ist die beste! Leider konnte ich es nicht in phpMyAdmin (4.5.0.2) ausführen, der, obwohl unlogisch (und verschiedene Dinge ausprobiert), immer wieder sagte, dass eine neue Anweisung gefunden wurde und kein Trennzeichen gefunden wurde…

Daher kam ich mit der folgenden Lösung, die nützlich sein könnte, wenn Sie dasselbe Problem haben und keinen anderen Zugriff auf die Datenbank als PMA haben…

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

Um das erwartete Ergebnis zu testen, möchten Sie möglicherweise Folgendes verwenden:

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

Wenn Sie sicher sind, dass keines der zu aktualisierenden Felder serialisiert ist, funktionieren die oben genannten Lösungen gut.

Wenn jedoch eines der Felder, die aktualisiert werden müssen, serialisierte Daten enthält, wird die Serialisierung durch eine SQL-Abfrage oder ein einfaches Suchen / Ersetzen in einer Speicherauszugsdatei unterbrochen (es sei denn, die ersetzte Zeichenfolge enthält genau die gleiche Anzahl von Zeichen wie die gesuchte Zeichenfolge).

Ein "serialisiertes" Feld sieht allerdings folgendermaßen aus:

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

Die Anzahl der Zeichen in den relevanten Daten wird als Teil der Daten codiert.
Die Serialisierung ist eine Möglichkeit, "Objekte" in ein Format zu konvertieren, das leicht in einer Datenbank gespeichert werden kann, oder Objektdaten einfach zwischen verschiedenen Sprachen zu transportieren.
Hier finden Sie eine Erklärung der verschiedenen Methoden zum Serialisieren von Objektdaten und warum Sie dies möglicherweise möchten. Hier finden Sie einen WordPress-zentrierten Beitrag: Serialisierte Daten, was bedeutet das und warum ist es so wichtig? im Klartext.

Es wäre erstaunlich, wenn MySQL ein eingebautes Tool hätte, um serialisierte Daten automatisch zu verarbeiten, aber dies ist nicht der Fall, und da es verschiedene Serialisierungsformate gibt, wäre es nicht einmal sinnvoll, dies zu tun.

wp-cli
Einige der obigen Antworten schienen spezifisch für WordPress-Datenbanken zu sein, die einen Großteil ihrer Daten serialisieren. WordPress bietet ein Kommandozeilen-Tool, wp search-replace , das die Serialisierung übernimmt .
Ein grundlegender Befehl wäre:

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

WordPress betont jedoch, dass das guidniemals geändert werden sollte , daher empfiehlt es, diese Spalte zu überspringen.
Es wird auch empfohlen, dass Sie häufig die wp_usersTabelle überspringen möchten .
So würde das aussehen:

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

Hinweis: Ich habe das --dry-runFlag hinzugefügt, damit durch das Kopieren und Einfügen nicht automatisch die Datenbank von Personen zerstört wird. Wenn Sie sicher sind, dass das Skript das tut, was Sie wollen, führen Sie es erneut ohne dieses Flag aus.

Plugins
Wenn Sie WordPress verwenden, gibt es auch viele kostenlose und kommerzielle Plugins, die eine GUI-Schnittstelle bieten, um dasselbe zu tun, gepackt mit vielen zusätzlichen Funktionen.

Interconnect / it-PHP-Skript
Interconnect / it bietet ein PHP-Skript für die Verarbeitung serialisierter Daten: Tool zum sicheren Suchen und Ersetzen . Es wurde für die Verwendung auf WordPress-Sites erstellt, kann aber anscheinend in jeder von PHP serialisierten Datenbank verwendet werden.
Viele Unternehmen, einschließlich WordPress selbst, empfehlen dieses Tool. Anleitung hier, ca. 3/4 auf der Seite.


1

Am besten exportieren Sie es als SQL-Datei und öffnen es mit einem Editor wie Visual Studio-Code, um Ihre Wörter zu finden und neu zu formulieren. Ich ersetze in 1 Gig-Datei SQL in 1 Minuten für 16 Wörter, die insgesamt 14600 Wort ist. Es ist der beste Weg. und nach dem Ersetzen speichern und erneut importieren. Vergessen Sie nicht, es für den Import mit zip zu komprimieren.


0

Generieren Sie Änderungs-SQL-Abfragen (SCHNELL)

mysql -e "SELECT CONCAT ('update', tabellenname, 'set', spaltenname, '= replace (', spaltenname, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') AS-Anweisung FROM information_schema.columns WHERE Tabellenname LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Entfernen Sie den Müll am Anfang der Datei. Ich hatte einige.

nano upgrade_script.sql

Führen Sie das generierte Skript mit den Optionen --force aus, um Fehler zu überspringen. (LANGSAM - Kaffee trinken, wenn große DB)

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


0

Bei Sätzen mit Groß- und Kleinbuchstaben können wir BINARY REPACE verwenden

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.