Aquí podría ser tu PUBLICIDAD


Buscar en todos los campos de todas las tablas de una base de datos MySQL

votos
245

Quiero buscar en todos los campos de todas las tablas de una base de datos MySQL una cadena dada, posiblemente usando sintaxis como:

SELECT * FROM * WHERE * LIKE '%stuff%'

¿Es posible hacer algo como esto?

Publicado el 12/03/2009 a las 17:57
fuente por usuario RSilva
En otros idiomas...        العربية       

23 respuestas

votos
391

Se podría hacer una SQLDumpde la base de datos (y sus datos) y luego buscar ese archivo.

Respondida el 27/01/2011 a las 02:51
fuente por usuario Dean Rather


Aquí podría ser tu PUBLICIDAD


votos
164

Si tiene instalado phpMyAdmin usar su función 'Buscar'.

  • Seleccione su base de datos
  • Estar seguro de que tiene una base de datos seleccionada (es decir, no una mesa, de lo contrario obtendrá un diálogo de búsqueda completamente diferente)
  • Haga clic en la pestaña 'Buscar'
  • Elija el término de búsqueda que desea
  • Elija las tablas para buscar

He utilizado este en un máximo de bases de datos / 10GB 250 de mesa (en un servidor rápido) y el tiempo de respuesta es poco menos que increíble.

Respondida el 01/10/2010 a las 06:22
fuente por usuario Greg Lyon

votos
68

Puedes echar un vistazo al information_schemaesquema. Tiene una lista de todas las tablas y todos los campos que están en una tabla. A continuación, puede ejecutar consultas utilizando la información que ha obtenido de esta tabla.

Las tablas involucradas son SCHEMATA, TABLAS y COLUMNAS. Hay claves externas para que pueda crear exactamente cómo se crean las tablas en un esquema.

Respondida el 12/03/2009 a las 06:00
fuente por usuario Milhous

votos
40

Puede usar este proyecto: http://code.google.com/p/anywhereindb

Esto buscará todos los datos en toda la tabla.

Respondida el 12/05/2009 a las 05:07
fuente por usuario nafis

votos
39
function searchAllDB($search){
    global $mysqli;

    $out = "";

    $sql = "show tables";
    $rs = $mysqli->query($sql);
    if($rs->num_rows > 0){
        while($r = $rs->fetch_array()){
            $table = $r[0];
            $out .= $table.";";
            $sql_search = "select * from ".$table." where ";
            $sql_search_fields = Array();
            $sql2 = "SHOW COLUMNS FROM ".$table;
            $rs2 = $mysqli->query($sql2);
            if($rs2->num_rows > 0){
                while($r2 = $rs2->fetch_array()){
                    $colum = $r2[0];
                    $sql_search_fields[] = $colum." like('%".$search."%')";
                }
                $rs2->close();
            }
            $sql_search .= implode(" OR ", $sql_search_fields);
            $rs3 = $mysqli->query($sql_search);
            $out .= $rs3->num_rows."\n";
            if($rs3->num_rows > 0){
                $rs3->close();
            }
        }
        $rs->close();
    }

    return $out;
}
Respondida el 08/03/2011 a las 04:58
fuente por usuario Olivier

votos
8

Si usted es evitar stored procedurescomo la peste, o es incapaz de hacer una mysql_dumpdebido a los permisos, o correr en otras varias razones.

Yo sugeriría un enfoque de tres pasos como esto:

1) Cuando esta consulta se acumula un montón de consultas como un conjunto de resultados.

# =================
# VAR/CHAR SEARCH
# =================
# BE ADVISED USE ANY OF THESE WITH CAUTION
# DON'T RUN ON YOUR PRODUCTION SERVER 
# ** USE AN ALTERNATE BACKUP **

SELECT 
    CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
           ' WHERE ', A.COLUMN_NAME, ' LIKE \'%stuff%\';') 
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE 
            A.TABLE_SCHEMA != 'mysql' 
AND     A.TABLE_SCHEMA != 'innodb' 
AND     A.TABLE_SCHEMA != 'performance_schema' 
AND     A.TABLE_SCHEMA != 'information_schema'
AND     
        (
            A.DATA_TYPE LIKE '%text%'
        OR  
            A.DATA_TYPE LIKE '%char%'
        )
;

.

# =================
# NUMBER SEARCH
# =================
# BE ADVISED USE WITH CAUTION

SELECT 
    CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
           ' WHERE ', A.COLUMN_NAME, ' IN (\'%1234567890%\');') 
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE 
            A.TABLE_SCHEMA != 'mysql' 
AND     A.TABLE_SCHEMA != 'innodb' 
AND     A.TABLE_SCHEMA != 'performance_schema' 
AND     A.TABLE_SCHEMA != 'information_schema'
AND     A.DATA_TYPE IN ('bigint','int','smallint','tinyint','decimal','double')
;

.

# =================
# BLOB SEARCH
# =================
# BE ADVISED THIS IS CAN END HORRIFICALLY IF YOU DONT KNOW WHAT YOU ARE DOING
# YOU SHOULD KNOW IF YOU HAVE FULL TEXT INDEX ON OR NOT
# MISUSE AND YOU COULD CRASH A LARGE SERVER
SELECT 
    CONCAT('SELECT CONVERT(',A.COLUMN_NAME, ' USING utf8) FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
           ' WHERE CONVERT(',A.COLUMN_NAME, ' USING utf8) IN (\'%someText%\');') 
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE 
            A.TABLE_SCHEMA != 'mysql' 
AND     A.TABLE_SCHEMA != 'innodb' 
AND     A.TABLE_SCHEMA != 'performance_schema' 
AND     A.TABLE_SCHEMA != 'information_schema'
AND     A.DATA_TYPE LIKE '%blob%'
;

Los resultados deben tener este aspecto:

Copiar estos resultados en otra ventana de consulta

2) A continuación, puede simplemente Right Clicky utilizar elCopy Row (tab separated)

introducir descripción de la imagen aquí

3) Resultados pegar en una nueva ventana de consulta y gestión de contenido de su corazón.

Detalle: excluyo sistema de esquema de que es posible que no suele ver en su mesa de trabajo a menos que tenga la opción Show Metadata and Internal Schemasmarcada.

Hice esto para proporcionar una forma rápida de ANALYZEtodo un HOST o DB, si es necesario, o para ejecutar OPTIMIZEdeclaraciones para apoyar las mejoras de rendimiento.

Estoy seguro de que hay diferentes maneras en que puede ir sobre hacer esto, pero esto es lo que funciona para mí:

-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEM
SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';

-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO OPTIMIZE THEM
SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';

Probado con MySQL Versión: 06/05/23

ADVERTENCIA: NO EJECUTAR ESTA OPCIÓN SI:

  1. Usted está preocupado con la causa de la tabla-locks (mantener un ojo en sus client-connections)
  2. No está seguro de lo que está haciendo.

  3. Usted está tratando de que la ira de DBA. (es posible que la gente en su escritorio con la rapidez .)

Cheers, Jay; -]

Respondida el 17/11/2016 a las 01:56
fuente por usuario JayRizzo

votos
8

También hice mi propio rastreador MySQL para buscar alguna configuración wordpress, era incapaz de encontrar en la interfaz y la base de datos, y los vertederos de base de datos fueron demasiado pesados ​​e ilegible. Debo decir que no puedo estar sin ella.

Funciona como el de @Olivier, pero gestiona los nombres de base de datos / de mesa exóticos y es seguro LIKE-comodín.

<?php

$database = 'database';
$criteria = '*iemblo'; // you can use * and ? as jokers

$dbh = new PDO("mysql:host=127.0.0.1;dbname={$database};charset=utf8", 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$tables = $dbh->query("SHOW TABLES");
while (($table = $tables->fetch(PDO::FETCH_NUM)) !== false)
{
    $fields = $dbh->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?");
    $fields->execute(array ($database, $table[0]));

    $ors = array ();
    while (($field = $fields->fetch(PDO::FETCH_NUM)) !== false)
    {
        $ors[] = str_replace("`", "``", $field[0]) . " LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(:search, '\\\\', '\\\\\\\\'), '%', '\\%'), '_', '\\_'), '*', '%'), '?', '_')";
    }

    $request = 'SELECT * FROM ';
    $request .= str_replace("`", "``", $table[0]);
    $request .= ' WHERE ';
    $request .= implode(' OR ', $ors);
    $rows = $dbh->prepare($request);

    $rows->execute(array ('search' => $criteria));

    $count = $rows->rowCount();
    if ($count == 0)
    {
        continue;
    }

    $str = "Table '{$table[0]}' contains {$count} rows matching '{$criteria}'.";
    echo str_repeat('-', strlen($str)), PHP_EOL;
    echo $str, PHP_EOL;
    echo str_repeat('-', strlen($str)), PHP_EOL;

    $counter = 1;
    while (($row = $rows->fetch(PDO::FETCH_ASSOC)) !== false)
    {
        $col = 0;
        $title = "Row #{$counter}:";
        echo $title;
        foreach ($row as $column => $value)
        {
            echo
            (($col++ > 0) ? str_repeat(' ', strlen($title) + 1) : ' '),
            $column, ': ',
            trim(preg_replace('!\s+!', ' ', str_replace(array ("\r", "\t", "\n"), array ("", "", " "), $value))),
            PHP_EOL;
        }
        echo PHP_EOL;
        $counter++;
    }
}

La ejecución de esta secuencia de comandos podría generar algo como:

---------------------------------------------------
Table 'customers' contains 1 rows matching '*iemblo'.
---------------------------------------------------
Row #1: email_client: my@email.com
        numero_client_compta: C05135
        nom_client: Tiemblo
        adresse_facturation_1: 151, My Street
        adresse_facturation_2: 
        ville_facturation: Nantes
        code_postal_facturation: 44300
        pays_facturation: FR
        numero_tva_client: 
        zone_geographique: UE
        prenom_client: Alain
        commentaires: 
        nom_societe: 
        email_facturation: my@email.com
Respondida el 08/10/2014 a las 11:30
fuente por usuario Alain Tiemblo

votos
6

Esta es la pregunta más sencilla de retrive todas las columnas y las tablas

SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'

Todas las mesas o los que tienen cadena específica en el nombre podría ser buscados a través de la búsqueda de tabulación en phpMyAdmin.

Tiene Niza consulta ... \ ^. ^ /

Respondida el 11/02/2011 a las 05:56
fuente por usuario aji

votos
4

Aquí está mi solución para este

DROP PROCEDURE IF EXISTS findAll;
CREATE PROCEDURE `findAll`( IN `tableName` VARCHAR( 28 ) , IN `search` TEXT )
BEGIN
       DECLARE finished INT DEFAULT FALSE ;
       DECLARE columnName VARCHAR ( 28 ) ;
       DECLARE stmtFields TEXT ;
       DECLARE columnNames CURSOR FOR
              SELECT DISTINCT `COLUMN_NAME` FROM `information_schema`.`COLUMNS`
              WHERE `TABLE_NAME` = tableName ORDER BY `ORDINAL_POSITION` ;
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;
       SET stmtFields = '' ;
       OPEN columnNames ;
       readColumns: LOOP
              FETCH columnNames INTO columnName ;
              IF finished THEN
                     LEAVE readColumns ;
              END IF;
              SET stmtFields = CONCAT(
                     stmtFields , IF ( LENGTH( stmtFields ) > 0 , ' OR' , ''  ) ,
                     ' `', tableName ,'`.`' , columnName , '` REGEXP "' , search , '"'
              ) ;
       END LOOP;
       SET @stmtQuery := CONCAT ( 'SELECT * FROM `' , tableName , '` WHERE ' , stmtFields ) ;
       PREPARE stmt FROM @stmtQuery ;
       EXECUTE stmt ;
       CLOSE columnNames ;
END;
Respondida el 02/02/2012 a las 11:46
fuente por usuario user862010

votos
3

Soy utilizar HeidiSQL es una herramienta útil y fiable diseñada para los desarrolladores web utilizando el popular servidor MySQL.

En HeidiSQL puede presionar Shift + Ctrl + F y se puede buscar texto en el servidor en todas las mesas. Esta opción es muy útil.

Respondida el 13/02/2016 a las 03:36
fuente por usuario Lev K.

votos
3

El uso de MySQL Workbench es fácil para seleccionar varias tablas y ejecutar una búsqueda de texto en todas las tablas de la base de datos ;-)

Respondida el 14/09/2015 a las 03:35
fuente por usuario Fred Christophe

votos
2

Aunque esta pregunta es viejo, aquí es cómo puede hacerlo si está utilizando MySQL Workbench 6.3. (Lo más probable es que también funciona para otras versiones)

Haga clic derecho en su esquema y "Buscar datos de la tabla", introduzca su valor y pulsa "Iniciar búsqueda". Eso es.

Respondida el 21/08/2016 a las 06:38
fuente por usuario Rpant

votos
2

He modificado la respuesta de PHP de Olivier un poco para:

  • imprimir los resultados en los que se encontró la cadena
  • omitir tablas sin resultados
  • también muestran salida si los nombres de columna que coincida con la entrada de búsqueda
  • mostrar número total de resultados

    function searchAllDB($search){
        global $mysqli;
    
        $out = "";
        $total = 0;
        $sql = "SHOW TABLES";
        $rs = $mysqli->query($sql);
        if($rs->num_rows > 0){
            while($r = $rs->fetch_array()){
                $table = $r[0];
                $sql_search = "select * from ".$table." where ";
                $sql_search_fields = Array();
                $sql2 = "SHOW COLUMNS FROM ".$table;
                $rs2 = $mysqli->query($sql2);
                if($rs2->num_rows > 0){
                    while($r2 = $rs2->fetch_array()){
                        $colum = $r2[0];
                        $sql_search_fields[] = $colum." like('%".$search."%')";
                        if(strpos($colum,$search))
                        {
                            echo "FIELD NAME: ".$colum."\n";
                        }
                    }
                    $rs2->close();
                }
                $sql_search .= implode(" OR ", $sql_search_fields);
                $rs3 = $mysqli->query($sql_search);
                if($rs3 && $rs3->num_rows > 0)
                {
                    $out .= $table.": ".$rs3->num_rows."\n";
                    if($rs3->num_rows > 0){
                        $total += $rs3->num_rows;
                        $out.= print_r($rs3->fetch_all(),1);
                        $rs3->close();
                    }
                }
            }
            $out .= "\n\nTotal results:".$total;
            $rs->close();
        }
        return $out;
    }
    
Respondida el 17/12/2015 a las 06:27
fuente por usuario Flion

votos
2

Esta solución
a) sólo es MySQL, ningún otro lenguaje necesario, y
b) devuelve resultados SQL, listos para su procesamiento!

#Search multiple database tables and/or columns
#Version 0.1 - JK 2014-01
#USAGE: 1. set the search term @search, 2. set the scope by adapting the WHERE clause of the `information_schema`.`columns` query
#NOTE: This is a usage example and might be advanced by setting the scope through a variable, putting it all in a function, and so on...

#define the search term here (using rules for the LIKE command, e.g % as a wildcard)
SET @search = '%needle%';

#settings
SET SESSION group_concat_max_len := @@max_allowed_packet;

#ini variable
SET @sql = NULL;

#query for prepared statement
SELECT
    GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '",@search,"'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM `information_schema`.`columns`
WHERE TABLE_NAME IN
(
    SELECT TABLE_NAME FROM `information_schema`.`columns`
    WHERE
        TABLE_SCHEMA IN ("my_database")
        && TABLE_NAME IN ("my_table1", "my_table2") || TABLE_NAME LIKE "my_prefix_%"
);

#prepare and execute the statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Respondida el 29/01/2014 a las 06:59
fuente por usuario Chonez

votos
2

Volcar el archivo SQL fue probablemente el más rápido y más rápido para mí. También descubrió otro problema de todos modos ..

Respondida el 08/02/2011 a las 09:59
fuente por usuario Chad

votos
2

Podrías usar

SHOW TABLES;

A continuación, obtenga las columnas en esas tablas (en un bucle) con

SHOW COLUMNS FROM table;

y luego con esa información crea muchas consultas que también puedes UNION si lo necesitas.

Pero esto es extremadamente pesado en la base de datos. Especialmente si estás haciendo una búsqueda LIKE.

Respondida el 12/03/2009 a las 06:01
fuente por usuario Ólafur Waage

votos
1

Si está utilizando phpMyAdminseguir esta respuesta , ese sitio esta referencia .

Respondida el 05/06/2018 a las 01:01
fuente por usuario Vishrant

votos
1

Exportar toda la base de datos y buscar en el archivo .sql.

Respondida el 25/10/2017 a las 02:57
fuente por usuario AllenBooTung

votos
0

tengo esto funcione. sólo tiene que cambiar las variables

$query ="SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`='" . $_SESSION['db'] . "' AND `table_name`='" . $table . "' ";
$stmt = $dbh->prepare($query);
$stmt->execute(); 
$columns = $stmt->fetchAll(PDO::FETCH_ASSOC);       

$query="SELECT name FROM `" . $database . "`.`" . $table . "` WHERE ( ";
foreach ( $columns as $column ) {
    $query .=" CONVERT( `" . $column['column_name'] . "` USING utf8 ) LIKE '%" . $search . "%' OR ";
}
$query = substr($query, 0, -3);
$query .= ")";

echo $query . "<br>";
$stmt=$dbh->prepare($query);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r ($results );
echo "</pre>";
Respondida el 11/08/2018 a las 10:15
fuente por usuario Trevor

votos
0

He construido en una respuesta anterior y tener esto, un poco de acolchado extra sólo para ser capaz de unirse convenientemente toda la salida:

SELECT 
CONCAT('SELECT ''',A.TABLE_NAME, '-' ,A.COLUMN_NAME,''' FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
       ' WHERE ', A.COLUMN_NAME, ' LIKE \'%Value%\' UNION')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE 
        A.TABLE_SCHEMA != 'mysql' 
AND     A.TABLE_SCHEMA != 'innodb' 
AND     A.TABLE_SCHEMA != 'performance_schema' 
AND     A.TABLE_SCHEMA != 'information_schema'
UNION SELECT 'SELECT '''

-- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead

En primer lugar se ejecuta este, a continuación, pegar y correr en el resultado (sin editar) y se mostrará todos los nombres de tablas y columnas en que se utiliza el valor.

Respondida el 10/08/2018 a las 10:08
fuente por usuario Jim Björklund

votos
0

No sé si esto es sólo en las versiones recientes, pero hacer clic derecho sobre la Tablesopción en el Navigatorpanel hace aparecer una opción llamada Search Table Data. Esto abre un cuadro de búsqueda donde surte en la cadena de búsqueda y seleccionar buscar.

Usted tiene que seleccionar la tabla que desea buscar en el panel izquierdo. Pero si se mantiene presionada la tecla shift y seleccionar como 10 mesas a la vez, MySQL puede manejar eso y volver resultados en cuestión de segundos.

Para cualquier persona que está buscando mejores opciones! :)

Respondida el 11/12/2017 a las 05:58
fuente por usuario Crazy Cucumber

votos
0

Hay una buena biblioteca para la lectura de todas las tablas, ridona

$database = new ridona\Database('mysql:dbname=database_name;host=127.0.0.1', 'db_user','db_pass');

foreach ($database->tables()->by_entire() as $row) {

....do

}
Respondida el 25/10/2017 a las 04:56
fuente por usuario mirhossein

votos
0

Solía ​​Unión encadenar consultas. No sé si se trata de la forma más eficiente, pero funciona.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
Respondida el 01/08/2016 a las 11:35
fuente por usuario mrmills129


Aquí podría ser tu PUBLICIDAD