web-dev-qa-db-fra.com

Rechercher et remplacer du texte dans l'ensemble du tableau à l'aide d'une requête MySQL

Habituellement, j'utilise find manuel pour remplacer du texte dans une base de données MySQL avec phpmyadmin. J'en ai assez, comment puis-je lancer une requête pour trouver et remplacer un texte par un nouveau texte dans tout le tableau de phpmyadmin? 

Exemple: recherchez le mot clé domain.com, remplacez-le par www.domain.com.

207
alyasabrina

Pour une mise à jour single table 

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

De multiple tables

Si vous voulez éditer toutes les tables, le mieux est de prendre dump puis find/replace et de le télécharger à nouveau.

492
swapnesh

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 remplacer et de recharger la base de données dans MySQL.

Toutes les commandes sont bash sur Linux, à partir de la mémoire.

Vider la base de données dans un fichier texte

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

Exécuter 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.

30
siliconrockstar

Mettez ceci dans un fichier php et lancez-le. Il devrait faire ce que vous voulez.

// 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']);
}
26
Lee Woodman

Exécuter une requête SQL dans PHPmyadmin pour rechercher et remplacer du texte dans toutes les publications de blog wordpress, telles que rechercher mysite.com/wordpress et le remplacer par mysite.com/newsTable, dans cet exemple, est tj_posts.

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
21
guest
 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, je vais utiliser ci-dessous, 

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
8
Umesh Patil

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.

6
Farid.O

Je crois que "swapnesh" répond d'être le meilleur! Malheureusement, je ne pouvais pas l'exécuter dans phpMyAdmin (4.5.0.2) qui, bien qu'illogique (et ayant essayé plusieurs choses), répétait qu'une nouvelle déclaration avait été trouvée et qu'aucun délimiteur n'avait été trouvé…

Ainsi, je suis arrivé 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`;
2
llange

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

Toutefois, si l'un des champs nécessitant une mise à jour contient des données sérialisées, une requête SQL ou une simple recherche/remplacement sur un fichier de vidage interrompt la sérialisation - à moins que la chaîne remplacée ait 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é en tant que partie des données. C'est un moyen de convertir facilement des "objets" en un format facilement stocké dans une base de données. Voici un explication de comment, pourquoi et de différentes méthodes utilisé pour sérialiser les données d'objet. Voici une autre description , mais en langage clair.

Ce serait étonnant si MySQL avait un outil intégré pour gérer correctement les données sérialisées, mais ce n’est pas le cas.
(Pour être juste, le lien précédent indique pourquoi cela n’aurait même pas de sens de le faire.)

wp-cli
Certaines des réponses ci-dessus semblaient spécifiques aux WordPress bases de données, qui sérialisent une grande partie de leurs données. WordPress propose un outil de ligne de commande, wp search-replace , qui gère la sérialisation.
Une commande de base serait:

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

Cependant, wordpress souligne que le guid ne devrait jamais être modifié , il est donc recommandé de sauter cette colonne. Cela suggère également que vous voudrez souvent sauter la table wp_users. 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 drapeau --dry-run afin qu'un copier-coller ne gâche pas automatiquement la base de données de quiconque. Une fois que vous êtes certain 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 plug-ins gratuits et commerciaux offrant une interface graphique permettant de faire la même chose, avec de nombreuses fonctionnalités supplémentaires.

Script php d'interconnexion/it
Interconnect/propose un script php pour gérer les données sérialisées, outil Safe Search and Replace , créé pour être utilisé sur les sites WordPress, mais semble pouvoir être utilisé. sur toute base de données sérialisée par PHP. De nombreuses entreprises, y compris WordPress, recommandent elles-mêmes cet outil. Instructions ici, environ 3/4 en bas de la page.

1
SherylHohman

le mieux que vous exportez sous forme de fichier SQL et ouvrez-le avec l'éditeur tel que code de studio visuel et trouver et repalace vos mots . Je remplace dans 1 fichier de fichier SQL en 1 minutes pour 16 Word que total est 14600 Word . c’est la meilleure façon… .. et après le remplacer, sauvegardez et importez-le à nouveau… .. n'oubliez pas de le compresser avec Zip pour l’importer.

0
Omid Ahmadyani

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

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

Supprimez les ordures au début du fichier. J'en ai eu.

nano upgrade_script.sql

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

mysql -u root -p votre_nom_db_ici - ici --force <upgrade_script.sql

0
Andy