Buscar en todos los campos de cada tabla de una base de datos MySQL

298

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

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

¿Es posible hacer algo como esto?

RSilva
fuente

Respuestas:

81

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

Las tablas involucradas son SCHEMATA, TABLES y COLUMNS. Hay claves foráneas para que pueda crear exactamente cómo se crean las tablas en un esquema.

Milhous
fuente
49
Esta no es la respuesta que quería, pero debo aceptar la verdad. : D Gracias
RSilva
1
Esto es correcto, pero la respuesta de @Dan Rather también ayudó, porque la base de datos que estaba mirando estaba configurada de forma oscura y no podía entender cuál sería el nombre de la columna o la tabla con solo mirar ...
DrCord
12
information_schemaes una base de datos, no una tabla. ¡Alguna aclaración sobre qué tabla buscar information_schemasería buena!
CaptSaltyJack
3
Para mí es bastante gracioso que MySql no proporcionara ninguna forma de buscar en todas las tablas. Parece una opción bastante rudimentaria
Kolob Canyon
@KolobCanyon MySQL proporciona una opción para hacerlo a través de SHOW TABLES FROM db_name LIKE 'pattern'
vladkras el
442

Puede hacer una SQLDumpde la base de datos (y sus datos) y luego buscar ese archivo.

Dean Rather
fuente
20
No olvide que puede usar el indicador --extended-insert = FALSE para mysqldump para que la salida sea más legible.
Benubird
26
En caso de que se esté preguntando, como yo, de qué se trata el comentario del lápiz: snopes.com/business/genius/spacepen.asp
Jason Swett
2
Esta es la forma "estándar" (de facto) de buscar bases de datos completas. Me gusta mysqldump -Tque crea dos archivos por tabla en un directorio especificado. Luego grep <search> *en el directorio, y lo que se devuelve es el archivo tablename.txt o .sql. El archivo txt contiene los datos de la tabla (delimitado por tabuladores, renombra a csv para abrir en Excel), y el sql contiene la definición de la tabla, lo has adivinado: SQL. De esta manera, está buscando todo y es fácil limitar dónde están sus datos. Sin embargo, este método puede ser bastante difícil de conseguir en ciertos entornos. Stack Overflow es muy útil aquí.
Joel Mellon
Cuando tiene un gran SQL, o tal vez en un archivo, puede abrirlo en MC directamente en el servidor, luego ver-> Buscar
Vitaly Zdanevich
1
Buena sugerencia! Pero, no funcionará si el archivo de volcado de db es realmente grande (situación que estoy teniendo ahora :))
Boban
207

Si tiene instalado phpMyAdmin, use su función 'Buscar'.

  • Seleccione su base de datos
  • Asegúrese de tener una base de datos seleccionada (es decir, no una tabla, de lo contrario obtendrá un cuadro de diálogo de búsqueda completamente diferente)
  • Haga clic en la pestaña 'Buscar'
  • Elige el término de búsqueda que deseas
  • Elige las tablas para buscar

He usado esto en hasta 250 tablas / bases de datos de 10GB (en un servidor rápido) y el tiempo de respuesta es sorprendente.

Greg Lyon
fuente
8
Una de nuestras bases de datos es 92.7Gb y esta opción funcionó bien. Gran solución
Tricky
55
Siempre olvido lo que todo phpMyAdmin puede hacer. ¡Es una gran herramienta!
Ville
1
Extremadamente rápido y útil en mi base de datos Magento. Encontré el campo para los datos que estaba buscando en un par de segundos, y también todas las otras tablas que lo hacían referencia.
mtrueblood
1
MySQL Workbench también tiene esta característica: "Base de datos >> Buscar datos de tabla ..."
matt wilkie
1
¡Agradable! ahora, ¿cómo reemplazaría la cadena buscada en phpmyadmin?
Pathros
46

Función PHP:

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()){
                    $column = $r2[0];
                    $sql_search_fields[] = $column." 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;
}
Olivier
fuente
Esto es pho, para aquellos que no saben.
Nandostyle
Establecer $mysqliasí:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor
Además, le recomiendo reemplazar $columcon "`$colum`"por lo que los campos que son palabras reservadas no causará problemas
Adam Taylor
41

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

Esto buscará todos los datos en todas las tablas.


fuente
Ya no funciona para PHP7. (mysql_connect en desuso en PHP 5.5.0, eliminado en PHP 7.0.0)
iDev247
12

Si está evitando stored procedurescomo la peste, o no puede hacerlo mysql_dumpdebido a los permisos, o se encuentra con otras razones.

Sugeriría un enfoque de tres pasos como este:

1) Donde esta consulta genera un montón de consultas como 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 deberían verse así:

Copie estos resultados en otra ventana de consulta

2) Entonces puedes simplemente Right Clicky usar elCopy Row (tab-separated)

ingrese la descripción de la imagen aquí

3) Pegue los resultados en una nueva ventana de consulta y ejecute el contenido de su corazón.

Detalle: excluyo los esquemas del sistema que normalmente no puede ver en su banco de trabajo a menos que tenga la opción Show Metadata and Internal Schemasmarcada.

Hice esto para proporcionar una manera rápida a ANALYZEun HOST o DB completo si es necesario o para ejecutar OPTIMIZEdeclaraciones para apoyar las mejoras de rendimiento.

Estoy seguro de que hay diferentes maneras de hacerlo, 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 en la versión de MySQL: 5.6.23

ADVERTENCIA: NO EJECUTE ESTO SI:

  1. Le preocupa causar bloqueos de tabla (vigile las conexiones de sus clientes)
  2. No estás seguro de lo que estás haciendo.

  3. Estás tratando de enojarte DBA. (puede tener personas en su escritorio con la rapidez ).

Saludos, Jay; -]

JayRizzo
fuente
1
Definitivamente, no es algo que desee ejecutar en una base de datos en vivo, pero es útil para ciertas tareas de depuración. Sin embargo, esto falla si el tipo de columna no se compara con una cadena. Es decir, una columna int.
Michael Thessel
Gran punto, agregué tres alternativas para buscar a través de blobs, caracteres o entradas. Esto es solo una generalización y SIEMPRE debe usarse con PRECAUCIÓN. NUNCA en PRODUCCIÓN como mencionaste, eso es lo que te hace despedir "Encontrar guiones en Internet y no entenderlos, pero aún así ejecutarlos", pero bueno, así es como la gente aprende de la manera difícil.
JayRizzo
8

También hice mi propio rastreador mysql para buscar alguna configuración de wordpress, no pude encontrarla tanto en la interfaz como en la base de datos, y los volcados de la base de datos eran demasiado pesados ​​e ilegibles. Debo decir que no puedo prescindir de él ahora.

Funciona como el de @Olivier, pero gestiona nombres de tablas / bases de datos exóticos y es seguro como LIKE-joker.

<?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++;
    }
}

Ejecutar este script 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
Alain Tiemblo
fuente
1
Me sale este error: Error grave: excepción no detectada 'PDOException' con el mensaje 'SQLSTATE [42000]: Error de sintaxis o infracción de acceso: 1064 Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'key LIKE REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (' 180well * ',' \\ ',' \\\\ '),'% ',' en la línea 1 '
LLBBL
6

Esta es la consulta más simple para recuperar todas las columnas y tablas

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

Todas las tablas o aquellas con una cadena específica en el nombre se pueden buscar a través de la pestaña Buscar en phpMyAdmin.

Que tengas una buena consulta ... \ ^. ^ /

aji
fuente
20
¿Y qué hay de los valores?
themhz
6

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

Fred Christophe
fuente
¡Gracias! La primera vez que he usado workbench. Era bastante intuitivo, me señaló la mesa que necesitaba y pude ubicarla desde allí.
joshmiller
6

Aunque esta pregunta es antigua, así es cómo puede hacerlo si está utilizando mysql workbench 6.3. (Lo más probable es que también funcione para otras versiones)

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

Rpant
fuente
6

Aquí está mi solución para esto

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;
Daniel Vérité
fuente
1
cuando ejecuto CALL findAll('tbl_test','abb'), extraño este error: # 1267 - Mezcla ilegal de intercalaciones (utf8_general_ci, IMPLICIT) y (utf8_unicode_ci, IMPLICIT) para la operación '=' ¿Puede solucionarlo? ¡Gracias!
Davuz
6

Esta es la manera simple que sé. Seleccione su base de datos en PHPMyAdmin, vaya a la pestaña "Buscar" y escriba lo que desea encontrar y dónde buscará. Seleccione todas las tablas si buscará las palabras de todas las tablas. Luego "IR" y mira el resultado.Quiero encontrar la palabra VCD (puerta trasera) de mi base de datos de Wordpress para eliminar

ardan7779
fuente
5

Estoy usando HeidiSQL es una herramienta útil y confiable diseñada para desarrolladores web que utilizan el popular servidor MySQL.

En HeidiSQL puede presionar shift + ctrl + f y puede encontrar texto en el servidor en todas las tablas. Esta opción es muy útil.

Lev K.
fuente
+1 Parece hacer bien el trabajo y es una herramienta útil que ahorra el error involucrado en algunas de las otras respuestas. También vale la pena señalar que le permite elegir qué base de datos buscar.
Steve Chambers
3

Podrías usar

SHOW TABLES;

Luego 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 UNIR si lo necesitas.

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

Ólafur Waage
fuente
SHOW TABLES FROM <db_name>es más preciso
vladkras
3

Esta solución
a) es solo MySQL, no se necesita otro lenguaje,
yb) devuelve resultados SQL, ¡listos para procesar!

#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;
Chonez
fuente
Para este tipo de solución, por lo general, agregarlos a phpfiddler sería bueno para que la gente pueda ver e incluso comentar su solución. :)
pal4life
Recibo un error #1243 - Unknown prepared statement handler (stmt) given to EXECUTEcuando ejecuto su consulta en Phpmyadmin para buscar en toda la base de datos
Vicky Dev
@VickyDev Sé que ha pasado más de un año desde su pregunta. Lo siento. Sin embargo: creo que algo más está mal en su secuencia de comandos ya que stmt se declara en la fila de arriba EJECUTAR. ¿Qué versión de MySQL estás usando?
Chonez
2

Modifiqué un poco la respuesta PHP de Olivier a:

  • imprimir los resultados en los que se encontró la cadena
  • omitir tablas sin resultados
  • también muestra la salida si los nombres de columna coinciden con la entrada de búsqueda
  • muestra el 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;
    }
Flion
fuente
1

Me basé en una respuesta anterior y tengo esto, algo de relleno adicional solo para poder unir cómodamente 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

Primero ejecuta esto, luego pega y ejecuta el resultado (sin edición) y mostrará todos los nombres de tabla y columnas donde se usa el valor.

Jim Björklund
fuente
1
Cuatro comprobaciones en un valor de columna no es la forma más simple. Podrías / deberías WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')o incluso mejor, ejecutarlo, verificar los esquemas utilizados y establecer el esquema utilizado en el lugar en lugar de excluir a todos los demás.
bradbury9
1

Tengo esto para trabajar. solo necesitas 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>";
Trevor
fuente
1

He hecho esto usando HeidiSQL. No es fácil de encontrar, pero al presionar Ctrl + Shift + F se muestra el cuadro de diálogo "herramientas de tabla". Luego seleccione lo que desea buscar (base de datos completa en una sola tabla) e ingrese el valor "Texto para buscar" y haga clic en "Buscar". Lo encontré sorprendentemente rápido (870MiB db en menos de un minuto)

R1CHY_RICH
fuente
0

Usé Union para unir consultas. No sé si es la forma más eficiente, pero funciona.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
mrmills129
fuente
El problema con esta respuesta es que hay un número variable y desconocido de tablas
bradbury9
0

Hay una buena biblioteca para leer 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

}
mirhossein
fuente
0

No sé si esto es solo en las versiones recientes, pero al hacer clic derecho en la Tablesopción en el Navigatorpanel aparece una opción llamada Search Table Data. Esto abre un cuadro de búsqueda donde completa la cadena de búsqueda y presiona buscar.

Debe seleccionar la tabla en la que desea buscar en el panel izquierdo. Pero si mantiene presionada la tecla Mayús y selecciona como 10 tablas a la vez, MySql puede manejar eso y devolver los resultados en segundos.

¡Para cualquiera que esté buscando mejores opciones! :)

Pepino loco
fuente
¿En qué aplicación estás haciendo todo esto?
Jon Schneider
Él está usando la aplicación Navigator.
Damir Olejar