Encontre e substitua o texto em toda a tabela usando uma consulta MySQL

235

Normalmente eu uso o manual find para substituir o texto em um banco de dados MySQL usando phpmyadmin. Agora estou cansado disso, como posso executar uma consulta para localizar e substituir um texto por um novo texto em toda a tabela no phpmyadmin?

Exemplo: encontre a palavra-chave domain.com, substitua por www.domain.com.

alyasabrina
fonte
Possível duplicata de stackoverflow.com/questions/639531/…
sel
1
Você pode fazer algo como [isto] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod 16/04/2013
2
Isso ajudará você a conseguir o que precisa.
Dom
Possível duplicado da corda MySQL substituir
Steve Chambers

Respostas:

551

Para uma single tableatualização

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

De multiple tables-

Se você deseja editar a partir de todas as tabelas, a melhor maneira é pegar oe dumpdepois find/replacee enviá-lo de volta.

swapnesh
fonte
4
Isso substitui um campo inteiro ou com ele uma correspondência de substring dentro de um campo?
Randy Greencorn
3
Ele substituirá uma substring no campo @RandyGreencorn. Também diferencia maiúsculas de minúsculas.
Andrew Andrew
10
e substituirá 'domain.com' por 'www.domain.com' e 'www.domain.com' por 'www.www.domain.com'
michelek
2
Mais sobre isso: 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 no despejo para a find / substituir:sed "s:unwanted_text:wanted_text:g" dump.sql
Kakoma
2
Funciona bem. Como outros já disseram, às vezes eu tenho que mexer com as aspas para que funcione no phpMyAdmin. Usei-o para substituir apenas o texto "http:" por "https:" em uma coluna que contém endereços da Web completos. O restante dos endereços da web não foi tocado.
Heres2u
40

A maneira mais fácil que encontrei é despejar o banco de dados em um arquivo de texto, executar um comando sed para fazer a substituição e recarregar o banco de dados no MySQL.

Todos os comandos abaixo são do bash no Linux.

Despejar banco de dados em arquivo de texto

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

Execute o comando sed para localizar / substituir a sequência de destino

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

Recarregue o banco de dados no MySQL

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

Mole-mole.

siliconrockstar
fonte
2
Isso funciona incrivelmente rápido. Eu amo essa solução. Eu tive que fazer algumas substituições de URL e, em vez de usar barras como meus delimitadores, usei pipes (leia isso em grymoire.com/Unix/Sed.html ). Exemplo: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy
1
Foi tão rápido que pensei que não funcionava. Mas fez! Além disso, você pode simplesmente escapar de barras assim:\/\/domain.com
m.cichacz
2
Apenas um lembrete de que, no OS X, o sed -icomando pode gerar unterminated substitute patternerros. Você pode usar em seu sed -i '' -e 's/oldString/newString/g' ./db.sqllugar.
afterglowlee
25

Coloque isso em um arquivo php e execute-o e ele deve fazer o que você deseja que ele faça.

// 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
fonte
Não funcionou para mim, agradável sugestão embora - teria sido doce
AlexHighHigh
23

A execução de uma consulta SQL no PHPmyadmin para localizar e substituir o texto em todas as postagens do blog wordpress, como encontrar mysite.com/wordpress e substituí-la por mysite.com/news A tabela neste exemplo é tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
convidado
fonte
2
Obrigado pela consulta. Para o meu site WordPress o nome da coluna é wp_postsassim que os olhares de consultaUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.
10

Outra opção é gerar as instruções para cada coluna no banco de dados:

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

Isso deve gerar uma lista de instruções de atualização que você pode executar.

Farid.O
fonte
2
Mais lento que o dumping, mas para pessoas que não se sentem confortáveis ​​com a linha de comando, essa resposta é criativa e eficaz.
Stephane
3
Essa é de longe a melhor abordagem, se você tiver muitos dados e não puder despejá-los / recarregá-los.
Kariem
Oh cara, isso funcionou muito bem! Vou compartilhar meus scripts com base nesta ideia
Andy
Esta é uma solução subestimada. Totalmente funcionou para mim.
rw-intechra 21/04
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Por exemplo, se eu quiser substituir todas as ocorrências de John por Mark, usarei abaixo,

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

O phpMyAdmin inclui uma ferramenta de busca e substituição.

Selecione a tabela e clique em Pesquisar > Localizar e substituir

Essa consulta levou cerca de um minuto e substituiu com êxito vários milhares de instâncias oldurl.extpela newurl.extcolunapost_content

captura de tela do recurso de localização e substituição no phpMyAdmin

O melhor deste método: você pode verificar todas as partidas antes de cometer.

NB estou usando o phpMyAdmin 4.9.0.1

youtag
fonte
2

Acredito que a resposta "swapnesh" seja a melhor! Infelizmente não consegui executá-lo no phpMyAdmin (4.5.0.2) que, apesar de ilógico (e tentou várias coisas), continuou dizendo que uma nova declaração foi encontrada e que nenhum delimitador foi encontrado…

Portanto, eu vim com a seguinte solução que pode ser útil se você tiver o mesmo problema e não tiver outro acesso ao banco de dados além do 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 testar o resultado esperado, você pode querer 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`;
llange
fonte
2

Se você acredita que nenhum dos campos a serem atualizados são serializados, as soluções acima funcionarão bem.

No entanto, se algum dos campos que precisar de atualização contiver dados serializados, uma Consulta SQL ou uma simples pesquisa / substituição em um arquivo de despejo, a serialização será interrompida (a menos que a cadeia substituída tenha exatamente o mesmo número de caracteres que a cadeia pesquisada).

Para ter certeza, um campo "serializado" se parece com isso:

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

O número de caracteres nos dados relevantes é codificado como parte dos dados.
A serialização é uma maneira de converter "objetos" em um formato facilmente armazenado em um banco de dados ou de transportar facilmente dados de objetos entre diferentes idiomas.
Aqui está uma explicação dos diferentes métodos usados ​​para serializar dados de objetos, e por que você pode querer fazer isso, e aqui está uma postagem centrada no WordPress: Dados serializados, o que isso significa e por que é tão importante? em linguagem simples.

Seria incrível se o MySQL tivesse alguma ferramenta embutida para lidar com dados serializados automaticamente, mas não, e como existem diferentes formatos de serialização, não faria sentido fazê-lo.

wp-cli
Algumas das respostas acima pareciam específicas aos bancos de dados WordPress, que serializam muitos de seus dados. WordPress oferece uma ferramenta de linha de comando, wp procurar substituição , que faz alça de serialização.
Um comando básico seria:

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

No entanto, o WordPress enfatiza que guidnunca deve ser alterado , por isso recomenda pular essa coluna.
Também sugere que muitas vezes você deseja pular a wp_userstabela.
Aqui está como isso seria:

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

Nota: Adicionei o --dry-runsinalizador para que uma cópia e colagem não estrague automaticamente o banco de dados de ninguém. Depois de ter certeza de que o script faz o que você deseja, execute-o novamente sem esse sinalizador.

Plug-ins
Se você estiver usando o WordPress, também existem muitos plug-ins gratuitos e comerciais disponíveis que oferecem uma interface GUI para fazer o mesmo, empacotados com muitos recursos adicionais.

Interconnect / it php script
Interconnect / oferece um script php para manipular dados serializados: Ferramenta Safe Search and Replace . Foi criado para uso em sites WordPress, mas parece que pode ser usado em qualquer banco de dados serializado por PHP.
Muitas empresas, incluindo o próprio WordPress, recomendam esta ferramenta. Instruções aqui, cerca de 3/4 da página.

SherylHohman
fonte
1

o melhor é exportá-lo como arquivo sql e abri-lo com um editor, como o código do visual studio, e encontre e repalace suas palavras. Eu substituo no arquivo de 1 gig sql em 1 minuto por 16 palavras que total é 14600 palavra. é o melhor caminho. e depois de substituí-lo, salve e importe-o novamente. não se esqueça de compactá-lo com zip para importação.

Omid Ahmadyani
fonte
0

Gere consultas SQL de alteração (FAST)

mysql -e "SELECT CONCAT ('atualização', nome_tabela, 'conjunto', nome_da_coluna, '= substituir (', nome_coluna, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Instrução AS FROM information_schema.columns WHERE nome_tabela COMO' wp_% '"-u raiz -p seu_db_name_aqui> upgrade_script.sql

Remova qualquer lixo no início do arquivo. Eu tive alguns.

nano upgrade_script.sql

Execute o script gerado com as opções --force para ignorar erros. (LENTO - pegue um café se for grande)

mysql -u raiz -p seu_db_name_aqui --force <upgrade_script.sql

Andy
fonte
0

No caso de frases com letras maiúsculas e minúsculas, podemos usar BINARY REPACE

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