Szukaj we wszystkich polach z każdej tabeli bazy danych MySQL

298

Chcę wyszukiwać we wszystkich polach ze wszystkich tabel bazy danych MySQL dany ciąg znaków, prawdopodobnie używając składni jako:

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

Czy można zrobić coś takiego?

RSilva
źródło
2
Ten blog może być pomocny: winashwin.wordpress.com/2012/08/28/mysql-search

Odpowiedzi:

81

Możesz zajrzeć do information_schemaschematu. Zawiera listę wszystkich tabel i wszystkich pól znajdujących się w tabeli. Następnie możesz uruchamiać zapytania, korzystając z informacji uzyskanych z tej tabeli.

Tabele, których to dotyczy, to SCHEMATY, TABELE i KOLUMNY. Istnieją klucze obce, dzięki którym można dokładnie zbudować tabele w schemacie.

Milhous
źródło
49
nie takiej odpowiedzi chciałem, ale muszę zaakceptować prawdę. : D Dziękuję
RSilva
1
To prawda, ale odpowiedź @Dan Rather również pomogła, ponieważ baza danych, którą przeglądałem, została niejasno skonfigurowana i nie mogłem zorientować się, jaka nazwa kolumny lub tabela byłyby na pewno po prostu patrząc ...
DrCord
12
information_schemato baza danych, a nie tabela. Trochę wyjaśnienia, w której tabeli szukaćinformation_schemaDobrze byłoby
CaptSaltyJack
3
Zabawne jest dla mnie to, że MySql nie umożliwił przeszukiwania wszystkich tabel. Wygląda na dość podstawową opcję
Kanion Kolob
@KolobCanyon MySQL zapewnia opcję wykonania tego poprzez POKAŻ TABELE OD db_name JAK PODOBNE „wzorzec”
vladkras,
442

Możesz zrobić SQLDumpbazę danych (i jej dane), a następnie przeszukać ten plik.

Dean Rather
źródło
20
Nie zapomnij, że możesz użyć flagi --extended-insert = FALSE dla mysqldump, aby zwiększyć czytelność danych wyjściowych.
Benubird,
26
Jeśli zastanawiasz się, tak jak ja, o czym jest ten komentarz ołówkowy: snopes.com/business/genius/spacepen.asp
Jason Swett
2
Jest to „standardowy” (de facto) sposób przeszukiwania całych baz danych. Podoba mi się, mysqldump -Tktóry tworzy dwa pliki na tabelę w określonym katalogu. Następnie grep <search> *w katalogu, a zwrócono plik tablename.txt lub .sql. Plik txt przechowuje dane dla tabeli (rozdzielane tabulatorami, zmień nazwę na csv, aby otworzyć w programie Excel), a sql przechowuje definicję tabeli, zgadłeś: SQL. W ten sposób przeszukujesz wszystko i łatwo zawęzić dane. Ta metoda może być jednak dość trudna do uruchomienia w niektórych środowiskach. Przepełnienie stosu jest tutaj bardzo pomocne.
Joel Mellon
Kiedy masz duży SQL, a może w archiwum - możesz otworzyć go w MC bezpośrednio na serwerze, a następnie wyświetlić-> Wyszukaj
Witalij Zdanevich,
1
Fajna sugestia! Ale to nie zadziała, jeśli plik zrzutu db jest naprawdę duży (sytuacja, którą mam teraz :))
Boban
207

Jeśli masz zainstalowany phpMyAdmin, użyj jego funkcji „Szukaj”.

  • Wybierz swoją bazę danych
  • Upewnij się, że masz wybraną bazę danych (tj. Nie tabelę, w przeciwnym razie otrzymasz zupełnie inne okno dialogowe wyszukiwania)
  • Kliknij kartę „Wyszukaj”
  • Wybierz szukany termin
  • Wybierz tabele do przeszukania

Użyłem tego do 250 baz danych / 10 GB baz danych (na szybkim serwerze), a czas reakcji jest niesamowity.

Greg Lyon
źródło
8
Jedna z naszych baz danych ma 92,7 GB i ta opcja działała dobrze. Świetne rozwiązanie
Tricky,
5
Zawsze zapominam, co może zrobić cały phpMyAdmin. To świetne narzędzie!
Ville
1
Niezwykle szybki i pomocny w mojej bazie danych Magento. Znalazłem pole danych, których szukałem w ciągu kilku sekund, a także wszystkie inne tabele, które do niego odwoływały.
mtrueblood
1
MySQL Workbench ma również tę funkcję: „Baza danych >> Szukaj danych tabeli ...”
matt wilkie
1
Miły! teraz jak zastąpiłbyś szukany ciąg w phpmyadmin?
Pathros,
46

Funkcja 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
źródło
To pho dla tych, którzy mogą nie wiedzieć.
Nandostyle
Ustaw w $mysqliten sposób:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor
Również bardzo polecam zastąpienie $columze "`$colum`"tak, że pola, które są zarezerwowane słowa nie spowodują problemów
Adam Taylor
41

Możesz użyć tego projektu: http://code.google.com/p/anywhereindb

Spowoduje to przeszukanie wszystkich danych we wszystkich tabelach.


źródło
Nie działa już w PHP7. (mysql_connect przestarzałe w PHP 5.5.0, usunięte w PHP 7.0.0)
iDev247
12

Jeśli unikasz stored proceduresjak zarazy lub nie jesteś w stanie tego zrobićmysql_dump powodu uprawnień lub inne przyczyny.

Sugerowałbym takie trzyetapowe podejście:

1) Gdzie to zapytanie tworzy zestaw zapytań jako zestaw wyników.

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

Wyniki powinny wyglądać następująco:

Skopiuj te wyniki do innego okna zapytania

2) Następnie możesz po prostu Right Clicki użyćCopy Row (tab-separated)

wprowadź opis zdjęcia tutaj

3) Wklej wyniki w nowym oknie zapytania i biegnij do treści twojego serca.

Szczegół: wykluczam schematy systemowe, których zazwyczaj nie widzisz w swoim środowisku roboczym, chyba że masz taką opcję Show Metadata and Internal Schemas .

Zrobiłem to, aby zapewnić szybki dostęp do ANALYZEcałego hosta lub bazy danych w razie potrzeby lub do uruchomieniaOPTIMIZE instrukcje w celu poprawy wydajności.

Jestem pewien, że możesz to zrobić na różne sposoby, ale oto, co działa dla mnie:

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

Testowane na MySQL w wersji: 5.6.23

OSTRZEŻENIE: NIE URUCHAMIAJ TEGO, JEŚLI:

  1. Martwisz się powodowaniem blokad stołu (miej oko na połączenia klientów)
  2. Nie jesteś pewien, co robisz.

  3. Próbujesz złościć cię DBA. (możesz mieć ludzi przy biurku z szybkością .)

Pozdrawiam, Jay; -]

JayRizzo
źródło
1
Zdecydowanie nie jest to coś, co chcesz uruchomić na bazie danych na żywo, ale jest pomocne w przypadku niektórych zadań debugowania. Nie udaje się to jednak, jeśli typ kolumny nie jest porównywany z ciągiem. To jest kolumna int.
Michael Thessel,
Świetnie, dodałem trzy alternatywy do przeszukiwania obiektów blob, znaków lub int. To jest tylko uogólnienie i powinno ZAWSZE być używane z ostrożnością. NIGDY w PRODUKCJI, jak już wspomniałeś, to właśnie to powoduje, że zwalniasz „Znajdowanie skryptów w Internecie i ich nie rozumienie, ale mimo to ich uruchamianie”, ale, hej, ludzie uczą się na własnej skórze.
JayRizzo
8

Zrobiłem też własny przeszukiwacz mysql, aby przeszukać konfigurację WordPressa, nie byłem w stanie znaleźć jej zarówno w interfejsie, jak i bazie danych, a zrzuty bazy danych były zbyt ciężkie i nieczytelne. Muszę powiedzieć, że teraz nie mogę się bez tego obejść.

Działa jak ten z @Olivier, ale zarządza egzotycznymi nazwami baz danych / tabel i jest bezpieczny jak 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++;
    }
}

Uruchomienie tego skryptu może wygenerować coś takiego:

---------------------------------------------------
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
źródło
1
Otrzymuję ten błąd: Błąd krytyczny: Nieprzechwycony wyjątek „PDOException” z komunikatem „SQLSTATE [42000]: Błąd składniowy lub naruszenie dostępu: 1064 Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, czy jest odpowiednia składnia do użycia w pobliżu klucza LIKE REPLACE (REPLACE (REPLACE (REPLACE (REPLACE ('180well *),' \\ ',' \\\\ ')),'% „,” w wierszu 1 ”
LLBBL
6

Jest to najprostsze zapytanie do pobrania wszystkich kolumn i tabel

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

Wszystkie tabele lub tabele z określonym ciągiem w nazwie można przeszukiwać za pomocą karty Wyszukaj w phpMyAdmin.

Miej ładne zapytanie ... \ ^. ^ /

aji
źródło
20
a co z wartościami?
themhz
6

Korzystając z MySQL Workbench, łatwo jest wybrać kilka tabel i uruchomić wyszukiwanie tekstu we wszystkich tabelach DB ;-)

Fred Christophe
źródło
Dziękuję Ci! Pierwszy raz korzystałem ze stołu warsztatowego. Był dość intuicyjny, wskazał mi stół, którego potrzebowałem i mogłem go zlokalizować.
joshmiller
6

Chociaż to pytanie jest stare, oto jak możesz to zrobić, jeśli używasz mysql workbench 6.3. (Najprawdopodobniej działa również w przypadku innych wersji)

Kliknij prawym przyciskiem myszy swój schemat i „Przeszukaj dane tabeli”, wprowadź swoją wartość i naciśnij „Rozpocznij wyszukiwanie”. Otóż ​​to.

Rpant
źródło
6

Oto moje rozwiązanie tego problemu

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é
źródło
1
po uruchomieniu CALL findAll('tbl_test','abb')brakuje mi tego błędu: # 1267 - Nielegalna mieszanka zestawień (utf8_general_ci, IMPLICIT) i (utf8_unicode_ci, IMPLICIT) do operacji '=' Czy możesz to naprawić? Dzięki!
Davuz
6

To prosty sposób, który znam. Wybierz swoją bazę danych w PHPMyAdmin i przejdź do zakładki „Szukaj” i napisz, co chcesz znaleźć i gdzie będziesz szukać. Wybierz wszystkie tabele, jeśli będziesz wyszukiwać słowa ze wszystkich tabel. Następnie „GO” i sprawdź wynik.Chcę znaleźć słowo VCD (backdoor) z mojej bazy danych Wordpress do usunięcia

ardan7779
źródło
5

Używam HeidiSQL to przydatne i niezawodne narzędzie przeznaczone dla twórców stron internetowych korzystających z popularnego serwera MySQL.

W HeidiSQL możesz nacisnąć Shift + Ctrl + F i możesz znaleźć tekst na serwerze we wszystkich tabelach. Ta opcja jest bardzo przydatna.

Lev K.
źródło
+1 Wydaje się, że dobrze wykonuje pracę i jest użytecznym narzędziem, które ratuje zespół zaangażowany w niektóre inne odpowiedzi. Warto również zauważyć, że pozwala wybrać, które bazy danych mają być wyszukiwane.
Steve Chambers
3

Możesz użyć

SHOW TABLES;

Następnie pobierz kolumny w tych tabelach (w pętli) za pomocą

SHOW COLUMNS FROM table;

a następnie za pomocą tych informacji utwórz wiele wielu zapytań, które możesz również UNIONOWĄ, jeśli potrzebujesz.

Ale jest to bardzo ciężkie w bazie danych. Zwłaszcza jeśli wykonujesz wyszukiwanie LIKE.

Lalafur Waage
źródło
SHOW TABLES FROM <db_name>jest bardziej precyzyjny
vladkras,
3

To rozwiązanie
a) jest tylko MySQL, nie jest potrzebny żaden inny język,
b) zwraca wyniki SQL, gotowe do przetworzenia!

#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
źródło
Dla tego rodzaju rozwiązań zwykle byłoby fajnie dodać je do phpfiddler, aby ludzie mogli przyjrzeć się, a nawet skomentować twoje rozwiązanie. :)
pal4life
Dostaję błąd, #1243 - Unknown prepared statement handler (stmt) given to EXECUTEgdy uruchamiam zapytanie w Phpmyadmin w celu przeszukiwania całej bazy danych
Vicky Dev,
@ VickyDev Wiem, że minęło ponad rok od twojego pytania. Przepraszam. Niemniej jednak: myślę, że coś innego jest nie tak w twoim skrypcie, ponieważ stmt jest zadeklarowany w wierszu powyżej EXECUTE. Z jakiej wersji MySQL korzystasz?
Chonez
2

Zmodyfikowałem nieco odpowiedź Oliviera na PHP, aby:

  • wydrukuj wyniki, w których znaleziono łańcuch
  • pomiń tabele bez wyników
  • Pokaż także wynik, jeśli nazwy kolumn pasują do wyników wyszukiwania
  • pokaż całkowitą liczbę wyników

    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
źródło
1

Zbudowałem na podstawie poprzedniej odpowiedzi i mam to, dodatkowe wypełnienie, aby móc wygodnie połączyć wszystkie wyniki:

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

Najpierw uruchom to, a następnie wklej i uruchom wynik (bez edycji), a wyświetli się wszystkie nazwy tabel i kolumny, w których używana jest wartość.

Jim Björklund
źródło
1
Cztery kontrole wartości kolumny nie są najprostszym sposobem. Możesz / powinieneś, WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')a nawet lepiej, wykonać go, sprawdzić używane schematy i ustawić używany schemat tam, gdzie zamiast tego wszystkie inne.
bradbury9,
1

Mam to do pracy. wystarczy zmienić zmienne

$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
źródło
1

Zrobiłem to za pomocą HeidiSQL. Nie jest łatwo go znaleźć, ale naciskając Ctrl + Shift + F wyświetla okno dialogowe „Narzędzia tabel”. Następnie wybierz to, co chcesz przeszukać (Pełna baza danych do pojedynczej tabeli), wprowadź wartość „Tekst do znalezienia” i kliknij „Znajdź”. Stwierdziłem, że jest zaskakująco szybki (870 MB db w mniej niż minutę)

R1CHY_RICH
źródło
0

Użyłem Union do połączenia ze sobą zapytań. Nie wiem, czy jest to najbardziej wydajny sposób, ale działa.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
mrmills129
źródło
Problem z tą odpowiedzią polega na tym, że istnieje zmienna i nieznana liczba tabel
bradbury9,
0

Jest fajna biblioteka do czytania wszystkich stolików, 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
źródło
0

Nie wiem, czy jest to tylko w najnowszych wersjach, ale kliknięcie prawym przyciskiem myszy Tablesopcji w Navigatorpanelu powoduje wyświetlenie opcji o nazwieSearch Table Data . Spowoduje to otwarcie pola wyszukiwania, w którym należy wpisać ciąg wyszukiwania i nacisnąć Wyszukaj.

Musisz wybrać tabelę, którą chcesz przeszukać w lewym okienku. Ale jeśli przytrzymasz klawisz Shift i wybierzesz jak 10 tabel jednocześnie, MySql da sobie z tym radę i zwróci wyniki w ciągu kilku sekund.

Dla każdego, kto szuka lepszych opcji! :)

Szalony Ogórek
źródło
W jakiej aplikacji to wszystko robisz?
Jon Schneider,
Używa aplikacji Navigator.
Damir Olejar