210 votes

Recherche de toutes les occurrences d'une chaîne de caractères dans une base de données mysql

J'essaie de comprendre comment localiser toutes les occurrences d'une url dans une base de données. Je veux rechercher dans toutes les tables et tous les champs. Mais je n'ai aucune idée de par où commencer ou si c'est même possible.

0 votes

Par exemple, lors de la migration d'un site WordPress vers un autre domaine, je devais remplacer toutes les occurrences de l'ancien nom de domaine.

3 votes

2 votes

Exporter en texte tous les tableaux, puis Ctrl+F :)

240voto

Paolo Bergantino Points 199336

Une solution simple serait de faire quelque chose comme ceci :

mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename | grep -i "<search string>"

16 votes

@SchlaWeiner qui ne fait que déverser les données ; vous n'avez aucune idée du schéma de la ligne ou de la table.

5 votes

adminer.org fait un bon travail de recherche de texte dans TOUTES les tables (pour une base de données donnée).

2 votes

C'est logique si vous êtes pressé...

64voto

A. Googler Points 241

Je sais que c'est un vieux message, mais pour ceux qui, comme moi, ont trouvé ce message via Google, si vous avez installé phpmyadmin, il dispose d'une fonction de recherche globale.

0 votes

Que faire si vous ne connaissez pas la base de données actuelle ? Comme OP, j'ai besoin de trouver toutes les instances d'une adresse IP spécifique et j'ai 5+ GB de données dans ma base MySQL...

0 votes

Cette fonctionnalité a depuis été supprimée dans les nouvelles versions de Phpmyadmin.

2 votes

Je préfère HeidiSQL à phpMyAdmin. Même prix, beaucoup plus facile à utiliser et plus puissant. Plus rapide aussi.

24voto

Gurpreet Points 67

En utilisant le MySQL Workbench, vous pouvez rechercher une chaîne de caractères à partir de l'option de menu "Database" -> "Search Table Data".

Spécifiez LIKE %URL_TO_SEARCH% et sélectionnez à gauche toutes les tables dans lesquelles vous souhaitez effectuer une recherche. Vous pouvez utiliser "Cntrl + A" pour sélectionner toute l'arborescence à gauche, puis désélectionner les objets dont vous ne vous souciez pas.

enter image description here

13voto

MikeW Points 3392

Méthode de la force brute

declare @url varchar(255)

set @url = 'stackoverflow.com'

select 'select * from ' + rtrim(tbl.name) + ' where ' + 
          rtrim(col.name) + ' like %' + rtrim(@url) + '%'
from sysobjects tbl
inner join syscolumns col on tbl.id = col.id 
and col.xtype in (167, 175, 231, 239) -- (n)char and (n)varchar, there may be others to include
and col.length > 30 -- arbitrary min length into which you might store a URL
where tbl.type = 'U'    -- user defined table

Cela créera un script que vous pourrez exécuter sur la base de données.

select * from table1 where col1 like '%stackoverflow.com%'
select * from table1 where col2 like '%stackoverflow.com%'
select * from table2 where col3 like '%stackoverflow.com%'

etc.

8voto

jimmy.zoger Points 51

C'est ce que je cherchais moi-même lorsque nous avons changé de domaine sur notre site Wordpress. Cela ne peut être fait sans programmation, c'est donc ce que j'ai fait.

<?php  
  header("Content-Type: text/plain");

  $host = "localhost";
  $username = "root";
  $password = "";
  $database = "mydatabase";
  $string_to_replace  = 'old.example.com';
  $new_string = 'new.example.com';

  // Connect to database server
  mysql_connect($host, $username, $password);

  // Select database
  mysql_select_db($database);

  // List all tables in database
  $sql = "SHOW TABLES FROM ".$database;
  $tables_result = mysql_query($sql);

  if (!$tables_result) {
    echo "Database error, could not list tables\nMySQL error: " . mysql_error();
    exit;
  }

  echo "In these fields '$string_to_replace' have been replaced with '$new_string'\n\n";
  while ($table = mysql_fetch_row($tables_result)) {
    echo "Table: {$table[0]}\n";
    $fields_result = mysql_query("SHOW COLUMNS FROM ".$table[0]);
    if (!$fields_result) {
      echo 'Could not run query: ' . mysql_error();
      exit;
    }
    if (mysql_num_rows($fields_result) > 0) {
      while ($field = mysql_fetch_assoc($fields_result)) {
        if (stripos($field['Type'], "VARCHAR") !== false || stripos($field['Type'], "TEXT") !== false) {
          echo "  ".$field['Field']."\n";
          $sql = "UPDATE ".$table[0]." SET ".$field['Field']." = replace(".$field['Field'].", '$string_to_replace', '$new_string')";
          mysql_query($sql);
        }
      }
      echo "\n";
    }
  }

  mysql_free_result($tables_result);  
?>

J'espère que cela aidera quiconque se heurtera à ce problème à l'avenir :)

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