614 votes

Remplacement de chaînes de caractères MySQL

J'ai une colonne contenant des urls (id, url) :

http://www.example.com/articles/updates/43
http://www.example.com/articles/updates/866
http://www.example.com/articles/updates/323
http://www.example.com/articles/updates/seo-url
http://www.example.com/articles/updates/4?something=test

J'aimerais changer le mot "updates" en "news". Est-il possible de faire cela avec un script ?

2 votes

1 votes

Je viens ici depuis des années pour trouver l'ordre des paramètres REPLACE(...). Si jamais cette question est supprimée, je ne pourrai plus faire mon travail. Merci !

1398voto

gmaggio Points 2093
UPDATE your_table
SET your_field = REPLACE(your_field, 'articles/updates/', 'articles/news/')
WHERE your_field LIKE '%articles/updates/%'

Maintenant, les rangs qui étaient comme

http://www.example.com/articles/updates/43

sera

http://www.example.com/articles/news/43

http://www.electrictoolbox.com/mysql-find-replace-text/

25 votes

Question rapide, est-il vraiment nécessaire d'avoir la clause "WHERE" ?

61 votes

@JohnCrawford Selon l'article du lien : "Vous n'avez pas nécessairement à ajouter le WHERE LIKE à la fin, car si le texte à rechercher n'est pas là, la ligne ne sera pas mise à jour, mais cela devrait accélérer les choses ."

4 votes

La clause WHERE vous donne un contrôle spécifique sur ce qui est remplacé. Sans clause, chaque ligne sera vérifiée et les données seront potentiellement remplacées si une correspondance est trouvée.

147voto

onteria_ Points 18947

Oui, MySQL possède une fonction REPLACE() :

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
    -> 'WwWwWw.mysql.com'

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

Notez que c'est plus facile si vous en faites un alias lors de l'utilisation de SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....

1 votes

Tant que l'OP updates n'apparaît qu'une seule fois dans la chaîne, alors cela fonctionnerait. Sinon, vous êtes coincé avec la manipulation directe des chaînes de caractères, ce qui est une véritable plaie avec MySQL. À ce stade, il serait plus facile d'écrire un script unique pour sélectionner les champs, les manipuler dans le client, puis les réécrire.

23voto

Jay Points 6999

El remplacer devrait fonctionner pour vous.

REPLACE(str,from_str,to_str)

Renvoie la chaîne str avec toutes les occurrences de la chaîne from_str remplacées par la chaîne to_str. REPLACE() effectue une correspondance sensible à la casse lors de la recherche de from_str.

14voto

Deepak Kumbhar Points 161

Vous pouvez simplement utiliser la fonction replace().

Exemple :

avec la clause where-

update tableName set columnName=REPLACE(columnName,'from','to') where condition;

sans la clause "where".

update tableName set columnName=REPLACE(columnName,'from','to');

Note : La requête ci-dessus permet de mettre à jour les enregistrements directement dans la table, si vous voulez une requête de sélection et que les données ne doivent pas être affectées dans la table, vous pouvez utiliser la requête suivante.

select REPLACE(columnName,'from','to') as updateRecord;

6voto

RafaSashi Points 1492

En complément de la réponse de gmaggio si vous devez dynamiquement REPLACE y UPDATE selon une autre colonne vous pouvez faire par exemple :

UPDATE your_table t1
INNER JOIN other_table t2
ON t1.field_id = t2.field_id
SET t1.your_field = IF(LOCATE('articles/updates/', t1.your_field) > 0, 
REPLACE(t1.your_field, 'articles/updates/', t2.new_folder), t1.your_field) 
WHERE...

Dans mon exemple, la chaîne de caractères articles/news/ est stocké dans other_table t2 et il n'est pas nécessaire d'utiliser LIKE dans le WHERE clause.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X