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.
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.
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.
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']);
}
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')
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');
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.
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`;
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.
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.
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
nano upgrade_script.sql
mysql -u root -p Ihr_DB-Name_hier --force <Upgrade_script.sql