Comment puis-je utiliser mySQL replace () pour remplacer des chaînes dans plusieurs enregistrements?

166

Nous avons une base de données qui contient un tas d'enregistrements avec des données erronées dans une colonne, dans laquelle un éditeur intégré a échappé à des éléments qui n'auraient pas dû être échappés et il brise les liens générés.

Je souhaite exécuter une requête pour remplacer les mauvais caractères dans tous les enregistrements, mais je ne sais pas comment le faire. J'ai trouvé la replace()fonction dans MySQL, mais comment puis-je l'utiliser dans une requête?

Par exemple, quelle serait la syntaxe correcte si je voulais remplacer la chaîne &lt;par un crochet inférieur à angle réel ( <) dans tous les enregistrements &lt;de la articleItemcolonne? Est-ce que cela peut être fait en une seule requête (c.-à-d. Sélectionner et tout remplacer en un seul coup), ou dois-je faire plusieurs requêtes? Même s'il s'agit de plusieurs requêtes, comment puis-je utiliser replace()pour effectuer le remplacement sur la valeur d'un champ sur plus d'un enregistrement?

EmmyS
la source
5
avant de faire quoi que ce soit, assurez-vous également de sauvegarder la base de données. Vous utiliseriez également update pour mettre à jour n'importe quel champ.
Matt
1
duplication possible de MySql - Comment mettre à jour une partie d'une chaîne?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Possible duplication de la recherche MySQL et remplacer du texte dans un champ
zgormez

Réponses:

395

À un niveau très générique

UPDATE MyTable

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

WHERE SomeOtherColumn LIKE '%PATTERN%'

Dans votre cas, vous dites qu'ils se sont échappés, mais comme vous ne spécifiez pas comment ils se sont échappés, disons qu'ils se sont échappés vers GREATERTHAN

UPDATE MyTable

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

WHERE articleItem LIKE '%GREATERTHAN%'

Étant donné que votre requête va réellement fonctionner à l'intérieur de la chaîne, il WHEREest peu probable que votre clause effectuant sa correspondance de modèle améliore les performances - elle va en fait générer plus de travail pour le serveur. À moins que vous n'ayez un autre membre de clause WHERE qui améliorera les performances de cette requête, vous pouvez simplement faire une mise à jour comme celle-ci:

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

Vous pouvez également imbriquer plusieurs REPLACEappels

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

Vous pouvez également le faire lorsque vous sélectionnez les données (par opposition à lorsque vous les enregistrez).

Donc au lieu de:

SELECT MyURLString From MyTable

Vous pourriez faire

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

Raj Plus
la source
7
petit problème: GREATERTHAN est '>'
Olivier Dulac
23
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')
Simshaun
la source
Correction du &lt;s. Vous devez utiliser l'encodage de &, comme ceci: &amp;:)
Dan J
Je l'ai réédité. Merci de me le faire savoir. Cela m'est apparu quelques instants après avoir dit que je ne savais pas comment. C'est comme ça que mon monde fonctionne. :)
simshaun
6

Vérifie ça

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

Par exemple avec la chaîne d'échantillon:

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

EG avec nom de colonne / champ:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')
Développeur principal
la source
4

vous pouvez écrire une procédure stockée comme celle-ci:

CRÉER LA PROCÉDURE sanitize_ TABLE ()

COMMENCER

#replace espace avec trait de soulignement

UPDATE Table SET FieldName = REPLACE ( FieldName , "", "_") WHERE FieldName n'est pas NULL;

#delete dot

UPDATE Table SET FieldName = REPLACE ( FieldName , ".", "") WHERE FieldName n'est pas NULL;

#supprimer (

UPDATE Table SET FieldName = REPLACE ( FieldName , "(", "") WHERE FieldName n'est pas NULL;

#supprimer )

UPDATE Table SET FieldName = REPLACE ( FieldName , ")", "") WHERE FieldName n'est pas NULL;

#raplacez ou supprimez le caractère de votre choix

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

FIN

De cette façon, vous avez un contrôle modulaire sur la table.

Vous pouvez également généraliser la procédure stockée en la faisant, paramétrique avec table pour sanitoze paramètre d'entrée

Gianluca D'Ardia
la source
1
ces vérifications nulles sont redondantes
kiedysktos
Existe-t-il des outils simples et sûrs pour créer une procédure stockée mysql?
Ivan Slaughter
0

Cela vous aidera.

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

Résultat:

title = Elmer's Parade
TechyFlick
la source