Buscar y reemplazar texto en toda la tabla usando una consulta MySQL

235

Por lo general, uso la búsqueda manual para reemplazar el texto en una base de datos MySQL usando phpmyadmin. Estoy cansado de eso ahora, ¿cómo puedo ejecutar una consulta para buscar y reemplazar un texto con texto nuevo en toda la tabla en phpmyadmin?

Ejemplo: buscar palabra clave domain.com, reemplazar con www.domain.com.

alyasabrina
fuente
Posible duplicado de stackoverflow.com/questions/639531/…
sel
1
Puedes hacer algo como [esto] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod
2
Esto te ayudará a lograr lo que necesitas.
Dom
Posible duplicado de reemplazo de cadena MySQL
Steve Chambers

Respuestas:

551

Para una single tableactualización

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

De multiple tables-

Si desea editar desde todas las tablas, la mejor manera es tomar el dumpy luego find/replacesubirlo nuevamente.

swapnesh
fuente
44
¿Esto reemplaza un campo completo o con él coincide una subcadena dentro de un campo?
Randy Greencorn
3
Reemplazará una subcadena dentro del campo @RandyGreencorn. También es sensible a mayúsculas y minúsculas.
Andrew
10
y reemplazará 'dominio.com' con 'www.dominio.com' y 'www.dominio.com' con 'www.wwwdominio.com'
michelek
2
Más sobre esto: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Use sed en el basurero para buscar / reemplazar:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma
2
Funciona genial. Como han dicho otros, a veces tengo que meterme con las comillas para que funcione en phpMyAdmin. Lo usé para reemplazar solo el texto "http:" con "https:" en una columna que contiene direcciones web completas. El resto de las direcciones web quedaron intactas.
Heres2u
40

La forma más fácil que he encontrado es volcar la base de datos en un archivo de texto, ejecutar un comando sed para hacer el reemplazo y volver a cargar la base de datos en MySQL.

Todos los comandos a continuación son bash en Linux.

Volcar la base de datos al archivo de texto

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

Ejecute el comando sed para buscar / reemplazar la cadena de destino

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

Vuelva a cargar la base de datos en MySQL

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

Pan comido.

siliconrockstar
fuente
2
Esto funciona asombrosamente rápido. Amo esta solución Tuve que hacer algunos reemplazos de URL y en lugar de usar barras como delimitadores, usé tuberías en su lugar (lea esto grymoire.com/Unix/Sed.html ). Ejemplo: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy
1
Fue tan rápido que pensé que no funcionaba. Pero lo hizo! Además, puedes escapar de barras como esta:\/\/domain.com
m.cichacz
2
Solo un recordatorio de que en OS X, el sed -icomando puede arrojar un unterminated substitute patternerror. Puedes usar sed -i '' -e 's/oldString/newString/g' ./db.sqlen su lugar.
afterglowlee
25

Ponga esto en un archivo php y ejecútelo y debería hacer lo que quiere que haga.

// 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']);
}
Lee Woodman
fuente
No funcionó para mí, aunque buena sugerencia - habría sido dulce
AlexHighHigh
23

Ejecutar una consulta SQL en PHPmyadmin para buscar y reemplazar texto en todas las publicaciones de blog de WordPress, como encontrar mysite.com/wordpress y reemplazarlo con mysite.com/news La tabla en este ejemplo es tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
invitado
fuente
2
Gracias por la consulta Para mi sitio de WordPress, el nombre de la columna es wp_postspara que la consulta se veaUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.
10

Otra opción es generar las declaraciones para cada columna en la base de datos:

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

Esto debería generar una lista de declaraciones de actualización que luego puede ejecutar.

Farid.O
fuente
2
Más lento que el dumping, pero para las personas que no se sienten cómodas con la línea de comando, esta respuesta es creativa y efectiva.
Stephane
3
Este es, con mucho, el mejor enfoque, si tiene muchos datos y no puede volcarlos / recargarlos.
Kariem
¡Oh hombre, esto funcionó muy bien! Compartiré mis guiones basados ​​en esta idea
Andy
Esta es una solución infravalorada. Totalmente trabajado para mi.
rw-intechra
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Por ejemplo, si quiero reemplazar todas las apariciones de John por Mark, usaré a continuación,

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

phpMyAdmin incluye una herramienta ordenada para buscar y reemplazar.

Seleccione la tabla, luego presione Buscar > Buscar y reemplazar

Esta consulta tomó aproximadamente un minuto y reemplazó con éxito varios miles de instancias oldurl.extcon la newurl.extcolumna dentropost_content

captura de pantalla de la función de buscar y reemplazar en phpMyAdmin

Lo mejor de este método: puede verificar cada coincidencia antes de comprometerse.

Nota: estoy usando phpMyAdmin 4.9.0.1

youtag
fuente
2

¡Creo que la respuesta "swapnesh" es la mejor! Desafortunadamente no pude ejecutarlo en phpMyAdmin (4.5.0.2) que aunque ilógico (e intentó varias cosas) seguía diciendo que se encontró una nueva declaración y que no se encontró ningún delimitador ...

Por lo tanto, llegué con la siguiente solución que podría ser útil si experimenta el mismo problema y no tiene otro acceso a la base de datos que 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`;

Para probar el resultado esperado, puede usar:

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`;
embestida
fuente
2

Si está seguro de que ninguno de los campos que se actualizarán están serializados, las soluciones anteriores funcionarán bien.

Sin embargo, si alguno de los campos que necesita actualización contiene datos serializados, una consulta SQL o una simple búsqueda / reemplazo en un archivo de volcado, interrumpirá la serialización (a menos que la cadena reemplazada tenga exactamente el mismo número de caracteres que la cadena buscada).

Para estar seguro, un campo "serializado" se ve así:

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

El número de caracteres en los datos relevantes se codifica como parte de los datos.
La serialización es una forma de convertir "objetos" en un formato fácilmente almacenado en una base de datos, o de transportar fácilmente datos de objetos entre diferentes idiomas.
Aquí hay una explicación de los diferentes métodos utilizados para serializar datos de objetos, y por qué es posible que desee hacerlo, y aquí hay una publicación centrada en WordPress: Datos serializados, ¿qué significa eso y por qué es tan importante? en lenguaje sencillo.

Sería sorprendente si MySQL tuviera alguna herramienta integrada para manejar datos serializados automáticamente, pero no es así, y dado que existen diferentes formatos de serialización, ni siquiera tendría sentido que lo haga.

wp-cli
Algunas de las respuestas anteriores parecían específicas de las bases de datos de WordPress, que serializa gran parte de sus datos. WordPress ofrece una herramienta de línea de comandos, WP buscar-reemplazar , que hace serialización mango.
Un comando básico sería:

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

Sin embargo, WordPress enfatiza que guidnunca debe cambiarse , por lo que recomienda omitir esa columna.
También sugiere que muchas veces querrás saltarte la wp_usersmesa.
Así es como se vería:

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

Nota: agregué el --dry-runindicador para que copiar y pegar no arruine automáticamente la base de datos de nadie. Una vez que esté seguro de que el script hace lo que desea, ejecútelo nuevamente sin esa marca.

Complementos
Si está utilizando WordPress, también hay muchos complementos gratuitos y comerciales disponibles que ofrecen una interfaz gui para hacer lo mismo, empaquetados con muchas características adicionales.

Interconnect / it script PHP
Interconnect / it ofrece un script php para manejar datos serializados: herramienta Safe Search and Replace . Fue creado para su uso en sitios de WordPress, pero parece que puede usarse en cualquier base de datos serializada por PHP.
Muchas empresas, incluida la propia WordPress, recomiendan esta herramienta. Instrucciones aquí, aproximadamente 3/4 abajo de la página.

SherylHohman
fuente
1

lo mejor es exportarlo como archivo sql y abrirlo con un editor como código de estudio visual y buscar y volver a colocar sus palabras. Reemplazo en 1 archivo de concierto sql en 1 minutos por 16 palabras, ese total es 14600 palabras. Es la mejor manera. y después de reemplazarlo, guárdelo e impórtelo nuevamente. no olvides comprimirlo con zip para importarlo.

Omid Ahmadyani
fuente
0

Generar consultas SQL de cambio (FAST)

mysql -e "SELECT CONCAT ('actualizar', nombre_tabla, 'conjunto', nombre_columna, '= reemplazar (', nombre_columna ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') COMO instrucción FROM information_schema.columns WHERE table_name LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Elimine cualquier basura al inicio del archivo. Tuve algunos.

nano upgrade_script.sql

Ejecute el script generado con las opciones --force para omitir errores. (LENTO - tome un café si es un DB grande)

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

Andy
fuente
0

En el caso de oraciones con mayúsculas y minúsculas, podemos usar REPACE BINARIO

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Hoàng Vũ Tgtt
fuente