Trova e sostituisci il testo nell'intera tabella usando una query MySQL


235

Di solito uso la ricerca manuale per sostituire il testo in un database MySQL usando phpmyadmin. Sono stanco ora, come posso eseguire una query per trovare e sostituire un testo con nuovo testo nell'intera tabella in phpmyadmin?

Esempio: trova la parola chiave domain.com, sostituiscila con www.domain.com.



1
Puoi fare qualcosa del tipo [this] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod

2
Questo ti aiuterà a ottenere ciò di cui hai bisogno.
Dom

Risposte:


551

Per un single tableaggiornamento

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

Da multiple tables-

Se si desidera modificare da tutte le tabelle, il modo migliore è quello di prendere il dumpe poi find/replacecaricarlo di nuovo.


4
Sostituisce un intero campo o con esso corrisponde una sottostringa all'interno di un campo?
Randy Greencorn,

3
Sostituirà una sottostringa all'interno del campo @RandyGreencorn. Fa anche distinzione tra maiuscole e minuscole.
Andrew,

10
e sostituirà 'domain.com' con 'www.domain.com' e 'www.domain.com' con 'www.www.domain.com'
michelek

2
Altro su questo: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Usa sed sulla discarica per trovare / sostituire:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
Funziona alla grande. Come altri hanno già detto, a volte devo fare confusione con le virgolette per farlo funzionare in phpMyAdmin. L'ho usato per sostituire solo il testo "http:" con "https:" in una colonna contenente indirizzi web completi. Il resto degli indirizzi web non sono stati toccati.
Heres2u,

40

Il modo più semplice che ho trovato è scaricare il database in un file di testo, eseguire un comando sed per eseguire la sostituzione e ricaricare nuovamente il database in MySQL.

Tutti i comandi seguenti sono bash su Linux.

Scarica il database in un file di testo

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

Eseguire il comando sed per trovare / sostituire la stringa di destinazione

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

Ricarica il database in MySQL

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

Vai tranquillo.


2
Funziona incredibilmente veloce. Adoro questa soluzione. Ho dovuto fare alcune sostituzioni di URL e invece di usare le barre come delimitatori ho usato invece le pipe (leggi grymoire.com/Unix/Sed.html ). Esempio: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy,

1
Era così veloce che pensavo non funzionasse. Ma lo ha fatto! Inoltre, puoi semplicemente sfuggire alle barre come questa:\/\/domain.com
m.cichacz,

2
Solo un promemoria che in OS X, il sed -icomando potrebbe generare un unterminated substitute patternerrore. Puoi usare sed -i '' -e 's/oldString/newString/g' ./db.sqlinvece.
afterglowlee

25

Metti questo in un file php ed eseguilo e dovrebbe fare quello che vuoi che faccia.

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

Non ha funzionato per me, anche se un bel suggerimento - sarebbe stato carino
AlexHighAlto

23

Eseguire una query SQL in PHPmyadmin per trovare e sostituire il testo in tutti i post del blog di wordpress, come trovare mysite.com/wordpress e sostituirlo con mysite.com/news La tabella in questo esempio è tj_posts

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

2
Grazie per la domanda. Per il mio sito WordPress il nome della colonna è wp_postscosì che appare la queryUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.

10

Un'altra opzione è quella di generare le istruzioni per ogni colonna nel database:

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

Ciò dovrebbe generare un elenco di istruzioni di aggiornamento che è possibile eseguire.


2
Più lento del dumping, ma per le persone che non si sentono a proprio agio con la riga di comando, questa risposta è creativa ed efficace.
Stephane

3
Questo è di gran lunga l'approccio migliore, se si dispone di molti dati e non è possibile scaricarli / ricaricarli.
Kariem,

Oh amico, ha funzionato alla grande! Condividerò i miei script in base a questa idea
Andy,

Questa è una soluzione sottovalutata. Ha funzionato totalmente per me.
rw-intechra,

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

Come ad esempio, se voglio sostituire tutte le occorrenze di John con Mark che userò di seguito,

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

3

phpMyAdmin include uno strumento di ricerca e sostituzione accurato.

Seleziona la tabella, quindi premi Cerca > Trova e sostituisci

Questa query ha richiesto circa un minuto e ha sostituito con successo diverse migliaia di istanze oldurl.extcon newurl.extall'interno della colonnapost_content

screenshot della funzione Trova e sostituisci in phpMyAdmin

La cosa migliore di questo metodo: devi controllare ogni partita prima di impegnarti.

NB Sto usando phpMyAdmin 4.9.0.1


2

Credo che la risposta "swapnesh" sia la migliore! Sfortunatamente non ho potuto eseguirlo in phpMyAdmin (4.5.0.2) che, sebbene illogico (e ha provato diverse cose), ha continuato a dire che è stata trovata una nuova dichiarazione e che non è stato trovato alcun delimitatore ...

Quindi sono arrivato con la seguente soluzione che potrebbe essere utile se si verifica lo stesso problema e non si ha altro accesso al database di 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`;

Per testare il risultato atteso potresti voler usare:

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

Se sei sicuro che nessuno dei campi da aggiornare sia serializzato, le soluzioni sopra funzioneranno bene.

Tuttavia, se uno dei campi che devono essere aggiornati contiene dati serializzati, una query SQL o una semplice ricerca / sostituzione su un file di dump, interromperà la serializzazione (a meno che la stringa sostituita abbia esattamente lo stesso numero di caratteri della stringa cercata).

A dire il vero, un campo "serializzato" è simile al seguente:

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

Il numero di caratteri nei dati rilevanti è codificato come parte dei dati.
La serializzazione è un modo per convertire "oggetti" in un formato facilmente memorizzato in un database o per trasportare facilmente i dati degli oggetti tra lingue diverse.
Ecco una spiegazione dei diversi metodi usati per serializzare i dati degli oggetti, e perché potresti volerlo fare, ed ecco un post incentrato su WordPress: Dati serializzati, cosa significa e perché è così importante? in un linguaggio semplice.

Sarebbe sorprendente se MySQL avesse uno strumento integrato per gestire automaticamente i dati serializzati, ma non lo è, e poiché ci sono diversi formati di serializzazione, non avrebbe nemmeno senso farlo.

wp-cli
Alcune delle risposte di cui sopra sembravano specifiche per i database WordPress, che serializzano gran parte dei suoi dati. WordPress offre uno strumento a riga di comando, Wp ricerca-sostituzione , che fa maniglia serializzazione.
Un comando di base sarebbe:

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

Tuttavia, WordPress sottolinea che guidnon dovrebbe mai essere modificato , quindi consiglia di saltare quella colonna.
Suggerisce anche che spesso vorrai saltare il wp_userstavolo.
Ecco come sarebbe:

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

Nota: ho aggiunto il --dry-runflag in modo che un copia-incolla non rovini automaticamente il database di nessuno. Dopo che sei sicuro che lo script fa quello che vuoi, eseguilo di nuovo senza quella bandiera.

Plugin
Se stai usando WordPress, ci sono anche molti plugin gratuiti e commerciali disponibili che offrono un'interfaccia gui per fare lo stesso, impacchettati con molte funzionalità aggiuntive.

Interconnect / it php script
Interconnect / offre uno script php per gestire dati serializzati: strumento Safe Search and Replace . È stato creato per l'uso su siti WordPress, ma sembra che possa essere utilizzato su qualsiasi database serializzato da PHP.
Molte aziende, incluso WordPress stesso, raccomandano questo strumento. Istruzioni qui, circa 3/4 in fondo alla pagina.


1

il meglio lo esporti come file sql e lo apri con un editor come il codice di Visual Studio e trova e riproponi le tue parole. sostituisco in 1 gig file sql in 1 minuti per 16 parole quel totale è 14600 parole. è il modo migliore. e dopo averlo sostituito, salvalo e importalo di nuovo. non dimenticare di comprimerlo con zip per l'importazione.


0

Genera query SQL di modifica (FAST)

mysql -e "SELECT CONCAT ('update', nome_tabella, 'set', nome_colonna, '= sostituisci (', nome_colonna, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Istruzione AS FROM information_schema.columns DOVE table_name LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Rimuovere l'eventuale spazzatura all'inizio del file. Ne ho avuto un po '.

nano upgrade_script.sql

Esegui lo script generato con le opzioni --force per saltare gli errori. (LENTO - prendi un caffè se DB grande)

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


0

Nel caso di frasi con lettere maiuscole - lettere minuscole, possiamo usare BINARY REPACE

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.