Como posso usar o mySQL replace () para substituir strings em vários registros?

166

Temos um banco de dados que possui vários registros com alguns dados inválidos em uma coluna, nos quais um editor incorporado escapou de coisas que não deveriam ter escapado e está quebrando links gerados.

Quero executar uma consulta para substituir os caracteres incorretos em todos os registros, mas não consigo descobrir como fazê-lo. Eu encontrei a replace()função no MySQL, mas como posso usá-la dentro de uma consulta?

Por exemplo, qual seria a sintaxe correta se eu quisesse substituir a string &lt;por um colchete de ângulo menor que o real ( <) em todos os registros que possuem &lt;a articleItemcoluna? Isso pode ser feito em uma única consulta (ou seja, selecionar e substituir tudo de uma só vez), ou eu tenho que fazer várias consultas? Mesmo se houver várias consultas, como faço replace()para substituir o valor de um campo em mais de um registro?

EmmyS
fonte
5
Antes de fazer qualquer coisa, faça backup do banco de dados também. Você também usaria update para atualizar qualquer campo.
Matt
1
possível duplicado do MySql - Maneira de atualizar parte de uma string?
Ciro Santilli postou 8/09/15

Respostas:

395

Em um nível muito genérico

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'SearchForThis', 'ReplaceWithThis')

WHERE SomeOtherColumn LIKE '%PATTERN%'

No seu caso, você diz que eles escaparam, mas como você não especifica como eles escaparam, digamos que eles escaparam para GREATERTHAN

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

WHERE articleItem LIKE '%GREATERTHAN%'

Como sua consulta realmente funcionará dentro da cadeia, WHEREé improvável que sua cláusula que faça a correspondência de padrões melhore qualquer desempenho - ela realmente gerará mais trabalho para o servidor. A menos que você tenha outro membro da cláusula WHERE que melhore o desempenho dessa consulta, você pode simplesmente fazer uma atualização como esta:

UPDATE MyTable
SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

Você também pode aninhar várias REPLACEchamadas

UPDATE MyTable
SET StringColumn = REPLACE (REPLACE (StringColumn, 'GREATERTHAN', '>'), 'LESSTHAN', '<')

Você também pode fazer isso quando selecionar os dados (ao contrário de quando salvá-los).

Então, em vez de:

SELECT MyURLString From MyTable

Você poderia fazer

SELECT REPLACE (MyURLString, 'GREATERTHAN', '>') as MyURLString From MyTable

Raj More
fonte
7
menor queixa: GREATERTHAN é '>'
Olivier Dulac
23
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')
simshaun
fonte
Corrigido os &lt;s. Você precisa usar a codificação e, assim: &amp;:)
Dan J
Eu reeditei. Obrigado por me avisar. Me ocorreu momentos depois que eu disse que não sabia como. É assim que meu mundo funciona. :)
simshaun
6

Verifique isto

UPDATE some_table SET some_field = REPLACE("Column Name/String", 'Search String', 'Replace String')

Por exemplo, com string de amostra:

UPDATE some_table SET some_field = REPLACE("this is test string", 'test', 'sample')

EG com nome da coluna / campo:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')
Desenvolvedor-chefe
fonte
4

você pode escrever um procedimento armazenado como este:

CRIAR PROCEDIMENTO sanitize_ TABLE ()

INÍCIO

# substituir espaço por sublinhado

UPDATE Table SET FieldName = REPLACE ( FieldName , "", "_") ONDE FieldName não é NULL;

#delete ponto

Tabela UPDATE SET FieldName = REPLACE ( FieldName , ".", "") ONDE FieldName não é NULL;

#delete (

ATUALIZAÇÃO da tabela SET FieldName = REPLACE ( FieldName , "(", "")) ONDE FieldName não é NULL;

#delete)

UPDATE Table SET FieldName = REPLACE ( FieldName , ")", "") ONDE FieldName não é NULL;

#raplace ou exclua qualquer caractere desejado

# ..........................

FIM

Dessa forma, você tem controle modularizado sobre a tabela.

Você também pode generalizar o procedimento armazenado, tornando-o paramétrico com a tabela para limpar o parâmetro de entrada

Gianluca D'Ardia
fonte
1
esses controlos nulos são redundantes
kiedysktos
Existem ferramentas fáceis e seguras para criar o procedimento armazenado do mysql?
Ivan Slaughter
0

Isso irá ajudá-lo.

UPDATE play_school_data SET title= REPLACE(title, "&#39;", "'") WHERE title = "Elmer&#39;s Parade";

Resultado:

title = Elmer's Parade
TechyFlick
fonte