MySQL peut-il remplacer plusieurs caractères?

J’essaie de remplacer un groupe de caractères dans un champ MySQL. Je connais la fonction REPLACE mais cela ne remplace qu’une chaîne à la fois. Je ne vois aucune fonction appropriée dans le manuel .

Puis-je remplacer ou supprimer plusieurs chaînes à la fois? Par exemple, je dois remplacer les espaces par des tirets et supprimer les autres signes de ponctuation.

Vous pouvez enchaîner les fonctions REPLACE:

select replace(replace('hello world','world','earth'),'hello','hi') 

Cela va imprimer hi earth .

Vous pouvez même utiliser des sous-requêtes pour remplacer plusieurs chaînes!

 select replace(london_english,'hello','hi') as warwickshire_english from ( select replace('hello world','world','earth') as london_english ) sub 

Ou utilisez un JOIN pour les remplacer:

 select group_concat(newword separator ' ') from ( select 'hello' as oldword union all select 'world' ) orig inner join ( select 'hello' as oldword, 'hi' as newword union all select 'world', 'earth' ) trans on orig.oldword = trans.oldword 

Je vais laisser la traduction en utilisant des expressions de table communes comme exercice pour le lecteur;)

Cascading est la seule solution simple et directe à mysql pour le remplacement de plusieurs personnages.

 UPDATE table1 SET column1 = replace(replace(REPLACE(column1, '\r\n', ''), '
',''), '<\r>','')

J’ai utilisé lib_mysqludf_preg pour cela ce qui vous permet de:

Utilisez les expressions régulières PCRE directement dans MySQL

Avec cette bibliothèque installée, vous pouvez faire quelque chose comme ceci:

 SELECT preg_replace('/(\\.|com|www)/','','www.example.com'); 

Ce qui vous donnerait:

 example 

REPLACE fait un bon travail de remplacement des caractères ou des phrases partout où ils apparaissent dans une chaîne. Mais lorsque vous nettoyez les signes de ponctuation, vous devrez peut-être rechercher des motifs, par exemple une séquence d’espaces ou de caractères dans certaines parties du texte, par exemple au milieu d’un mot ou après un arrêt complet. Si tel est le cas, une fonction de remplacement d’une expression régulière serait beaucoup plus puissante. Les mauvaises nouvelles sont que MySQL ne fournit pas une telle chose, mais la bonne nouvelle est qu’il est possible de fournir une solution de contournement – voir cet article de blog .

Puis-je remplacer ou supprimer plusieurs chaînes à la fois? Par exemple, je dois remplacer les espaces par des tirets et supprimer les autres signes de ponctuation.

Ce qui précède peut être réalisé avec une combinaison du remplaçant d’expression régulière et de la fonction REPLACE standard. On peut le voir en action dans cette démo en ligne de Rextester .

SQL (excluant le code de fonction pour la brièveté) :

 SELECT txt, reg_replace(REPLACE(txt, ' ', '-'), '[^a-zA-Z0-9-]+', '', TRUE, 0, 0 ) AS `reg_replaced` FROM test; 

sur php

 $dataToReplace = [1 => 'one', 2 => 'two', 3 => 'three']; $sqlReplace = ''; foreach ($dataToReplace as $key => $val) { $sqlReplace = 'REPLACE(' . ($sqlReplace ? $sqlReplace : 'replace_field') . ', "' . $key . '", "' . $val . '")'; } echo $sqlReplace; 

résultat

 REPLACE( REPLACE( REPLACE(replace_field, "1", "one"), "2", "two"), "3", "three"); 

Je suggère d’exécuter un programme pour faire une boucle sur vos enregistrements, traiter les champs, puis les mettre à jour. Peut-être un simple script perl ou php.