Pesquise em todos os campos de todas as tabelas de um banco de dados MySQL

298

Quero pesquisar em todos os campos de todas as tabelas de um banco de dados MySQL uma determinada string, possivelmente usando a sintaxe como:

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

É possível fazer algo assim?

RSilva
fonte

Respostas:

81

Você pode espiar o information_schemaesquema. Ele tem uma lista de todas as tabelas e todos os campos que estão em uma tabela. Em seguida, você pode executar consultas usando as informações obtidas dessa tabela.

As tabelas envolvidas são ESQUEMA, TABELAS e COLUNAS. Existem chaves estrangeiras para que você possa criar exatamente como as tabelas são criadas em um esquema.

Milhous
fonte
49
essa não é a resposta que eu queria, mas devo aceitar a verdade. : D Obrigado
RSilva 12/03/09
1
Está correto, mas a resposta de @Dan Rather também ajudou, porque o banco de dados que eu estava examinando estava configurado obscuramente e eu não conseguia descobrir qual seria o nome ou a tabela da coluna com certeza apenas olhando ...
DrCord
12
information_schemaé um banco de dados, não uma tabela. Alguns esclarecimentos sobre qual tabela pesquisar dentro information_schemaseriam bons!
CaptSaltyJack 7/08
3
É meio hilário para mim que o MySql não tenha como pesquisar em todas as tabelas. Parece uma opção bastante rudimentar #
Kolob Canyon
@KolobCanyon MySQL fornece uma opção para fazê-lo através MOSTRAR TABELAS DE db_name LIKE 'padrão'
vladkras
442

Você pode fazer um SQLDumpbanco de dados (e seus dados) e pesquisar nesse arquivo.

Dean Rather
fonte
20
Não esqueça que você pode usar o sinalizador --extended-insert = FALSE no mysqldump para tornar a saída mais legível.
Benubird 24/01
26
Caso você esteja se perguntando, como eu era, o que o comentário lápis é sobre: snopes.com/business/genius/spacepen.asp
Jason Swett
2
Essa é a maneira "padrão" (de fato) de pesquisar bancos de dados inteiros. Eu gosto do mysqldump -Tque cria dois arquivos por tabela em um diretório especificado. Eu então grep <search> *no dir, e o que é retornado é o arquivo tablename.txt ou .sql. O arquivo txt mantém os dados da tabela (delimitado por tabulação, renomeie para csv para abrir no Excel) e o sql mantém a definição da tabela, você adivinhou: SQL. Dessa forma, você está pesquisando tudo e é fácil restringir onde estão seus dados. Esse método pode ser bastante difícil de trabalhar em determinados ambientes. O estouro de pilha é muito útil aqui.
Joel Mellon
Quando você tem um SQL grande, ou talvez arquivado - você pode abri-lo no MC no servidor e, em seguida,
exibir-
1
Boa sugestão! Mas, isso não vai funcionar se o arquivo de despejo db é muito grande (situação que eu estou tendo agora :))
Boban
207

Se você possui o phpMyAdmin instalado, use o recurso 'Pesquisar'.

  • Selecione seu DB
  • Certifique-se de ter um banco de dados selecionado (ou seja, não uma tabela, caso contrário, você obterá uma caixa de diálogo de pesquisa completamente diferente)
  • Clique na guia "Pesquisar"
  • Escolha o termo de pesquisa que você deseja
  • Escolha as tabelas para pesquisar

Eu usei isso em bancos de dados de até 250 tabelas / 10 GB (em um servidor rápido) e o tempo de resposta é incrível.

Greg Lyon
fonte
8
Um de nossos bancos de dados tem 92,7Gb e essa opção funcionou perfeitamente. Solução ótima
Tricky
5
Eu sempre esqueço o que todo o phpMyAdmin pode fazer. É uma ótima ferramenta!
Ville
1
Extremamente rápido e útil no meu Magento db. Encontrei o campo para os dados que eu estava procurando em alguns segundos e também todas as outras tabelas que estavam fazendo referência a ele.
mtrueblood
1
MySQL Workbench tem esse recurso também: "Banco de dados >> Pesquisa Tabela de Dados ..."
Matt Wilkie
1
Agradável! Agora, como você substituiria a string pesquisada no phpmyadmin?
Pathros
46

Função 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
fonte
Isso é Pho, para quem pode não saber.
Nandostyle 22/11/19
Defina $mysqliassim:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor
Além disso, eu recomendo substituir $columpor, "`$colum`"para que os campos que são palavras reservadas não causem problemas
Adam Taylor
41

Você pode usar este projeto: http://code.google.com/p/anywhereindb

Isso pesquisará todos os dados em todas as tabelas.


fonte
Não funciona mais para PHP7. (mysql_connect foi descontinuado no PHP 5.5.0, removido no PHP 7.0.0)
iDev247
12

Se você está evitando stored procedurescomo uma praga, ou não consegue fazer um mysql_dumpdevido a permissões, ou se deparar com outros motivos diversos.

Eu sugeriria uma abordagem em três etapas como esta:

1) Onde esta consulta cria um monte 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%'
;

Os resultados devem ficar assim:

Copie esses resultados em outra janela de consulta

2) Você pode então apenas Right Clickusar oCopy Row (tab-separated)

insira a descrição da imagem aqui

3) Cole os resultados em uma nova janela de consulta e execute o conteúdo do seu coração.

Detalhe: excluo os esquemas do sistema que você normalmente não vê no seu ambiente de trabalho, a menos que tenha a opção Show Metadata and Internal Schemasmarcada.

Fiz isso para fornecer uma maneira rápida de ANALYZEum HOST ou banco de dados inteiro, se necessário, ou para executar OPTIMIZEinstruções para dar suporte a melhorias de desempenho.

Tenho certeza de que existem maneiras diferentes de você fazer isso, mas eis o que funciona para mim:

-- ========================================== 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';

Testado na versão MySQL: 5.6.23

AVISO: NÃO EXECUTAR ISTO SE:

  1. Você está preocupado em causar bloqueios de tabela (fique de olho nas conexões do cliente)
  2. Você não tem certeza do que está fazendo.

  3. Você está tentando irritar seu DBA. (você pode ter pessoas em sua mesa com a rapidez .)

Saúde, Jay; -]

JayRizzo
fonte
1
Definitivamente, não é algo que você deseja executar em um banco de dados ativo, mas útil para determinadas tarefas de depuração. Isso falhará se o tipo de coluna não for comparado a uma sequência. Ou seja, uma coluna int.
Michael Thessel
Ótimo ponto, eu adicionei três alternativas para pesquisar por blobs, chars ou ints. Esta é apenas uma generalização e SEMPRE deve ser usada com cuidado. NUNCA na PRODUÇÃO, como você mencionou, é geralmente isso que o leva a demitir "Encontrar scripts na Internet e não entendê-los, mas ainda executá-los", mas é assim que as pessoas aprendem da maneira mais difícil.
JayRizzo
8

Também fiz meu próprio rastreador mysql para pesquisar alguma configuração do wordpress, não consegui encontrá-la na interface nem no banco de dados, e os despejos de banco de dados eram muito pesados ​​e ilegíveis. Devo dizer que não posso ficar sem isso agora.

Ele funciona como o do @Olivier, mas gerencia nomes de bancos de dados / tabelas exóticos e é seguro para o 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++;
    }
}

A execução desse script pode gerar 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
fonte
1
Eu recebo este erro: Erro fatal: Exceção não capturada 'PDOException' com a mensagem 'SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1064 Você tem um erro na sintaxe do SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto da tecla 'LIKE REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (' 180well * ',' \\ ',' \\\\ '),'% ',' na linha 1 '
LLBBL 7/09
6

Esta é a consulta mais simples para recuperar todas as colunas e tabelas

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

Todas as tabelas ou aquelas com string específica no nome podem ser pesquisadas na guia Pesquisar no phpMyAdmin.

Tenha uma Consulta Agradável ... \ ^. ^ /

aji
fonte
20
e quanto aos valores?
themhz
6

Usando o MySQL Workbench, é fácil selecionar várias tabelas e executar uma pesquisa por texto em todas as tabelas do banco de dados ;-)

Fred Christophe
fonte
Obrigado! Primeira vez que usei o ambiente de trabalho. Foi bastante intuitivo, apontou-me para a mesa de que precisava e pude localizá-la a partir daí.
Joshmiller # 25/19
6

Embora essa questão seja antiga, veja como você pode fazê-lo se estiver usando o mysql workbench 6.3. (Muito provavelmente também funciona para outras versões)

Clique com o botão direito do mouse em seu esquema e em "Pesquisar dados da tabela", insira seu valor e pressione "Iniciar pesquisa". É isso aí.

Rpant
fonte
6

Aqui está a minha solução para isso

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é
fonte
1
quando executo CALL findAll('tbl_test','abb'), sinto falta deste erro: # 1267 - Mistura ilegal de agrupamentos (utf8_general_ci, IMPLICIT) e (utf8_unicode_ci, IMPLICIT) para operation '=' Consegue corrigi-lo? Obrigado!
Davuz 25/05
6

Esta é a maneira simples que eu sei. Selecione seu banco de dados no PHPMyAdmin, vá para a guia "Pesquisar" e escreva o que deseja encontrar e onde procurará. Selecione todas as tabelas se você procurar as palavras de todas as tabelas. Então "GO" e veja o resultado.Quero encontrar a palavra VCD (backdoor) do meu Wordpress DB para excluir

ardan7779
fonte
5

Eu estou usando HeidiSQL é uma ferramenta útil e confiável projetada para desenvolvedores web usando o popular servidor MySQL.

No HeidiSQL, você pode pressionar shift + ctrl + f e pode encontrar texto no servidor em todas as tabelas. Esta opção é muito útil.

Lev K.
fonte
+1 Parece fazer bem o trabalho e é uma ferramenta útil que salva o problema envolvido em algumas das outras respostas. Também digno de nota que ele permite que você escolha qual banco de dados (s) para pesquisar.
Steve Chambers
3

Você poderia usar

SHOW TABLES;

Em seguida, obtenha as colunas nessas tabelas (em um loop) com

SHOW COLUMNS FROM table;

e, com essas informações, crie muitas consultas, que você também poderá unir, se precisar.

Mas isso é extremamente pesado no banco de dados. Especialmente se você estiver fazendo uma pesquisa COMO.

Ólafur Waage
fonte
SHOW TABLES FROM <db_name>é mais preciso
vladkras
3

Esta solução
a) é apenas MySQL, nenhuma outra linguagem é necessária
eb) retorna resultados SQL, prontos para processamento!

#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
fonte
Para esses tipos de solução, geralmente adicioná-los ao phpfiddler seria bom para que as pessoas pudessem dar uma olhada e até comentar sua solução. :)
pal4life 19/06/2014
Estou recebendo erro #1243 - Unknown prepared statement handler (stmt) given to EXECUTEquando eu executar a consulta no phpMyAdmin para pesquisar no banco de dados inteiro
Vicky Dev
@VickyDev Eu sei que já faz mais de um ano desde a sua pergunta. Desculpe. No entanto: acho que algo mais está errado no seu script, pois o stmt é declarado na linha acima de EXECUTE. Qual versão do MySQL você está usando?
Chonez 26/08
2

Modifiquei a resposta PHP de Olivier um pouco para:

  • imprima os resultados nos quais a string foi encontrada
  • omitir tabelas sem resultados
  • também mostra a saída se os nomes das colunas corresponderem à entrada de pesquisa
  • mostra o 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
fonte
1

Eu construí uma resposta anterior e tenho isso, algum preenchimento extra apenas para poder juntar convenientemente toda a saída:

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

Primeiro você executa isso, depois cola e executa o resultado (sem edição) e ele exibirá todos os nomes de tabelas e colunas em que o valor é usado.

Jim Björklund
fonte
1
Quatro verificações no valor de uma coluna não são a maneira mais simples. Você pode / deve WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')ou, melhor ainda, executá-lo, verificar os esquemas usados ​​e definir o esquema usado no local, excluindo todos os outros.
bradbury9
1

Eu tenho que trabalhar. você só precisa alterar as variáveis

$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
fonte
1

Eu fiz isso usando o HeidiSQL. Não é fácil encontrar, mas pressionando Ctrl + Shift + F ele exibe a caixa de diálogo "table tools". Em seguida, selecione o que deseja pesquisar (banco de dados completo em tabela única) e digite o valor "Texto a encontrar" e clique em "Localizar". Achei surpreendentemente rápido (870MiB db em menos de um minuto)

R1CHY_RICH
fonte
0

Eu usei o Union para encadear consultas. Não sei se é a maneira mais eficiente, mas funciona.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
mrmills129
fonte
O problema com essa resposta é que não é uma variável e unkown número de mesas
bradbury9
0

Existe uma boa biblioteca para ler todas as tabelas, 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
fonte
0

Não sei se isso é apenas nas versões recentes, mas clicar com o botão direito do mouse na Tablesopção no Navigatorpainel exibe uma opção chamadaSearch Table Data . Isso abre uma caixa de pesquisa onde você preenche a sequência de pesquisa e pressiona a pesquisa.

Você precisa selecionar a tabela que deseja pesquisar no painel esquerdo. Mas se você mantiver a tecla shift pressionada e selecionar 10 tabelas por vez, o MySql poderá lidar com isso e retornar os resultados em segundos.

Para quem procura melhores opções! :)

Pepino louco
fonte
Em que aplicativo você está fazendo tudo isso?
Jon Schneider
Ele está usando o aplicativo Navigator.
Damir Olejar