Rechercher et remplacer du texte dans la table entière à l'aide d'une requête MySQL

235

Habituellement, j'utilise la recherche manuelle pour remplacer le texte dans une base de données MySQL en utilisant phpmyadmin. J'en ai marre maintenant, comment puis-je exécuter une requête pour trouver et remplacer un texte par du nouveau texte dans la table entière dans phpmyadmin?

Exemple: rechercher un mot domain.com- clé , remplacer par www.domain.com.

alyasabrina
la source
1
Vous pouvez faire quelque chose comme [ceci] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod
2
Cela vous aidera à réaliser ce dont vous avez besoin.
Dom
Remplacement
Steve Chambers

Réponses:

551

Pour une single tablemise à jour

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

De multiple tables-

Si vous souhaitez modifier à partir de toutes les tables, la meilleure façon est de prendre le dumppuis de le find/replacetélécharger.

swapnesh
la source
4
Cela remplace-t-il un champ entier, ou avec lui une correspondance de sous-chaîne dans un champ?
Randy Greencorn
3
Il remplacera une sous-chaîne dans le champ @RandyGreencorn. Il est également sensible à la casse.
Andrew
10
et il remplacera 'domain.com' par 'www.domain.com' et 'www.domain.com' par 'www.www.domain.com'
michelek
2
Plus d'informations à ce sujet: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Utilisez sed sur la décharge pour la recherche / remplacement:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma
2
Fonctionne très bien. Comme d'autres l'ont dit, parfois je dois jouer avec les citations pour le faire fonctionner dans phpMyAdmin. Je l'ai utilisé pour remplacer uniquement le texte "http:" par "https:" dans une colonne contenant des adresses Web complètes. Les autres adresses Web n'ont pas été modifiées.
Heres2u
40

Le moyen le plus simple que j'ai trouvé est de vider la base de données dans un fichier texte, d'exécuter une commande sed pour effectuer le remplacement et de recharger la base de données dans MySQL.

Toutes les commandes ci-dessous sont bash sous Linux.

Vider la base de données dans un fichier texte

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

Exécutez la commande sed pour rechercher / remplacer la chaîne cible

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

Recharger la base de données dans MySQL

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

Peasy facile.

siliconrockstar
la source
2
Cela fonctionne incroyablement vite. J'adore cette solution. J'ai dû faire des remplacements d'URL et au lieu d'utiliser des barres obliques comme délimiteurs, j'ai plutôt utilisé des tuyaux (lisez ceci sur grymoire.com/Unix/Sed.html ). Exemple: sed -i | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy
1
C'était tellement rapide que je pensais que ça ne fonctionnait pas. Mais ça l'a fait! En outre, vous pouvez simplement échapper aux barres obliques comme ceci:\/\/domain.com
m.cichacz
2
Juste un rappel que sous OS X, la sed -icommande peut rejeter une unterminated substitute patternerreur. Vous pouvez utiliser à la sed -i '' -e 's/oldString/newString/g' ./db.sqlplace.
Afterglowlee
25

Mettez-le dans un fichier php et exécutez-le et il devrait faire ce que vous voulez qu'il fasse.

// 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
la source
Cela
23

Exécuter une requête SQL dans PHPmyadmin pour rechercher et remplacer du texte dans tous les articles de blog wordpress, comme trouver mysite.com/wordpress et le remplacer par mysite.com/news La table dans cet exemple est tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
client
la source
2
Merci pour la question. Pour mon site WordPress, le nom de la colonne est wp_postsainsi la requête ressembleUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.
10

Une autre option consiste à générer les instructions pour chaque colonne de la base de données:

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

Cela devrait générer une liste d'instructions de mise à jour que vous pouvez ensuite exécuter.

Farid.O
la source
2
Plus lent que le dumping, mais pour les personnes qui ne se sentent pas à l'aise avec la ligne de commande, cette réponse est créative et efficace.
Stéphane
3
C'est de loin la meilleure approche, si vous avez beaucoup de données et que vous ne pouvez pas les vider / les recharger.
Kariem
Oh mec, ça a très bien fonctionné! Je vais partager mes scripts basés sur cette idée
Andy
C'est une solution sous-estimée. Totalement travaillé pour moi.
rw-intechra
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Comme par exemple, si je veux remplacer toutes les occurrences de John par Mark que j'utiliserai ci-dessous,

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

phpMyAdmin inclut un outil de recherche et de remplacement soigné.

Sélectionnez le tableau, puis appuyez sur Rechercher > Rechercher et remplacer

Cette requête a pris environ une minute et a réussi à remplacer plusieurs milliers d'instances de oldurl.extla newurl.extcolonne danspost_content

capture d'écran de la fonction de recherche et de remplacement de phpMyAdmin

La meilleure chose à propos de cette méthode: vous pouvez vérifier chaque match avant de vous engager.

NB J'utilise phpMyAdmin 4.9.0.1

youtag
la source
2

Je crois que la réponse "swapnesh" est la meilleure! Malheureusement, je n'ai pas pu l'exécuter dans phpMyAdmin (4.5.0.2) qui, bien qu'illogique (et a essayé plusieurs choses), a continué à dire qu'une nouvelle déclaration avait été trouvée et qu'aucun délimiteur n'avait été trouvé…

Je suis donc venu avec la solution suivante qui pourrait être utile si vous rencontrez le même problème et n'avez pas d'autre accès à la base de données que 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`;

Pour tester le résultat attendu, vous pouvez utiliser:

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
la source
2

Si vous êtes certain qu'aucun des champs à mettre à jour n'est sérialisé, les solutions ci-dessus fonctionneront bien.

Cependant, si l'un des champs devant être mis à jour contient des données sérialisées, une requête SQL ou une simple recherche / remplacement sur un fichier de vidage interrompra la sérialisation (sauf si la chaîne remplacée a exactement le même nombre de caractères que la chaîne recherchée).

Pour être sûr, un champ "sérialisé" ressemble à ceci:

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

Le nombre de caractères dans les données pertinentes est codé dans le cadre des données.
La sérialisation est un moyen de convertir des "objets" dans un format facilement stocké dans une base de données, ou de transporter facilement des données d'objet entre différentes langues.
Voici une explication des différentes méthodes utilisées pour sérialiser les données d'objet, et pourquoi vous pouvez le faire, et voici un article centré sur WordPress: Données sérialisées, qu'est-ce que cela signifie et pourquoi est-ce si important? en langage simple.

Ce serait étonnant si MySQL avait un outil intégré pour gérer automatiquement les données sérialisées, mais ce n'est pas le cas, et comme il existe différents formats de sérialisation, cela n'aurait même pas de sens de le faire.

wp-cli
Certaines des réponses ci-dessus semblaient spécifiques aux bases de données WordPress, qui sérialisent une grande partie de ses données. WordPress offre un outil de ligne de commande, wp recherche-remplacement , qui ne sérialisation poignée.
Une commande de base serait:

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

Cependant, WordPress souligne que le guidne doit jamais être modifié , il recommande donc de sauter cette colonne.
Cela suggère également que souvent vous voudrez sauter la wp_userstable.
Voici à quoi cela ressemblerait:

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

Remarque: J'ai ajouté le --dry-rundrapeau afin qu'un copier-coller ne ruine pas automatiquement la base de données de quiconque. Une fois que vous êtes sûr que le script fait ce que vous voulez, exécutez-le à nouveau sans cet indicateur.

Plugins
Si vous utilisez WordPress, il existe également de nombreux plugins gratuits et commerciaux qui offrent une interface graphique pour faire de même, emballés avec de nombreuses fonctionnalités supplémentaires.

Interconnect / it script php
Interconnect / it propose un script php pour gérer les données sérialisées: outil Safe Search and Replace . Il a été créé pour être utilisé sur les sites WordPress, mais il semble qu'il puisse être utilisé sur n'importe quelle base de données sérialisée par PHP.
De nombreuses entreprises, dont WordPress lui-même, recommandent cet outil. Instructions ici, environ 3/4 en bas de la page.

SherylHohman
la source
1

mieux vous l'exportez en tant que fichier sql et l'ouvrez avec un éditeur tel que le code Visual Studio et trouvez et remplacez vos mots. je remplace dans 1 gigl de fichier sql en 1 minutes pour 16 mots ce total est 14600 mot. c'est la meilleure façon. et après le remplacer, enregistrez-le et importez-le à nouveau. n'oubliez pas de le compresser avec zip pour l'import.

Omid Ahmadyani
la source
0

Générer des requêtes SQL de changement (FAST)

mysql -e "SELECT CONCAT ('update', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Instruction AS FROM information_schema.columns WHERE table_name LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Supprimez tous les déchets au début du fichier. J'en avais.

nano upgrade_script.sql

Exécutez le script généré avec les options --force pour ignorer les erreurs. (LENT - prenez un café si gros DB)

mysql -u root -p votre_nom_db_here --force <upgrade_script.sql

Andy
la source
0

Dans le cas de phrases avec majuscules - minuscules, nous pouvons utiliser BINARY REPACE

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