it-swarm.com.de

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

Normalerweise verwende ich manuelles Suchen, um Text in einer MySQL-Datenbank mit phpmyadmin zu ersetzen. Ich bin jetzt müde. Wie kann ich eine Abfrage ausführen, um einen Text in der gesamten Tabelle in phpmyadmin durch neuen Text zu ersetzen und zu ersetzen? 

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

207
alyasabrina

Für ein single table-Update 

 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 die dump und dann find/replace und laden Sie sie zurück.

492
swapnesh

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

Alle Befehle sind bash unter Linux aus dem Speicher.

Dump-Datenbank in Textdatei

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

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

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

Laden Sie die Datenbank erneut in MySQL

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

Kinderleicht.

30
siliconrockstar

Fügen Sie dies in eine PHP-Datei ein und führen Sie es aus, und es sollte das tun, was Sie möchten.

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

Das Ausführen einer SQL-Abfrage in PHPmyadmin zum Suchen und Ersetzen von Text in allen Wordpress-Blogbeiträgen, z. B. mysite.com/wordpress und Ersetzen durch mysite.com/newsTable in diesem Beispiel ist tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
21
guest
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Wenn ich beispielsweise alle Vorkommen von John durch Mark ersetzen möchte, verwende ich unten: 

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

Eine weitere Option ist das Generieren der Anweisungen für jede Spalte in der Datenbank:

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

Dadurch sollte eine Liste von Aktualisierungsanweisungen generiert werden, die Sie dann ausführen können.

6
Farid.O

Ich glaube "swapnesh" als beste Antwort! Leider konnte ich es in phpMyAdmin (4.5.0.2) nicht ausführen, obwohl es unlogisch war (und mehrere Dinge ausprobierte), dass es immer eine neue Aussage gab und kein Trennzeichen gefunden wurde.

Daher kam ich mit der folgenden Lösung, die nützlich sein könnte, wenn Sie dasselbe Problem feststellen 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`;

Zum Testen des erwarteten Ergebnisses 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
llange

Wenn Sie sich sicher sind, dass keines der zu aktualisierenden Felder serialisiert ist, funktionieren die obigen Lösungen einwandfrei.

Wenn jedoch eines der zu aktualisierenden Felder 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.

Um sicherzugehen, sieht ein "serialisiertes" Feld so aus:

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

Die Anzahl der Zeichen in den relevanten Daten wird als Teil der Daten codiert. Es ist eine Möglichkeit, "Objekte" auf einfache Weise in ein Format zu konvertieren, das einfach in einer Datenbank gespeichert werden kann. Hier ist ein Erklärung, wie, warum und verschiedene Methoden zum Serialisieren von Objektdaten. Hier ist eine andere Beschreibung , aber im Klartext.

Es wäre erstaunlich, wenn MySQL ein eingebautes Tool hätte, um serialisierte Daten korrekt zu verarbeiten, aber das tut es nicht.
(Um fair zu sein, gibt der vorherige Link an, warum es nicht einmal Sinn macht, 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 Befehlszeilentool an, wp search-replace , das die Serialisierung übernimmt.
Ein grundlegender Befehl wäre:

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

In wordpress wird jedoch betont, dass guid niemals geändert werden sollte , daher wird empfohlen, diese Spalte zu überspringen. Es wird auch empfohlen, die Tabelle wp_users häufig zu überspringen. 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-run -Flag hinzugefügt, damit beim Kopieren und Einfügen nicht automatisch die Datenbank zerstört wird. Wenn Sie sicher sind, dass das Skript das tut, was Sie möchten, führen Sie es ohne dieses Flag erneut aus.

Plugins
Wenn Sie WordPress verwenden, gibt es auch viele kostenlose und kommerzielle Plugins, die eine GUI-Oberfläche mit vielen zusätzlichen Funktionen bieten.

Interconnect/it-PHP-Skript
Interconnect/it bietet ein PHP-Skript für den Umgang mit serialisierten Daten, Safe Search and Replace Tool, das für die Verwendung auf WordPress Sites erstellt wurde, aber anscheinend verwendet werden kann auf jeder von PHP serialisierten Datenbank. Viele Unternehmen, einschließlich WordPress selbst, empfehlen dieses Tool. Anleitung hier ca. 3/4 weiter unten.

1
SherylHohman

am besten Sie exportieren es als SQL-Datei und öffnen es mit einem Editor wie Visual Studio-Code, und suchen und repalaceieren Sie Ihre Wörter . es ist der beste Weg . und nach dem Ersetzen speichern und erneut importieren . Vergiss nicht, es mit Zip für den Import zu komprimieren.

0
Omid Ahmadyani

Änderungs-SQL-Abfragen generieren (FAST)

mysql -e "SELECT CONCAT ('Update', Tabellenname, 'Set', Spaltenname, '= Ersetzen (', Spaltenname, ',' 'www.oldsite.com' '),' 'www.newsite.com' '); ') AS-Anweisung FROM information_schema.columns WHERE-Tabellenname LIKE' wp_% '"-u root -p Ihr_db_name_hier> upgrade_script.sql

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

nano upgrade_script.sql

Generiertes Skript mit --force-Optionen ausführen, um Fehler zu überspringen. (SLOW - schnappen Sie sich einen Kaffee, wenn große DB)

mysql -u root -p Ihr_DB-Name_hier --force <Upgrade_script.sql

0
Andy