Cari di semua bidang dari setiap tabel basis data MySQL

298

Saya ingin mencari di semua bidang dari semua tabel dari database MySQL string yang diberikan, mungkin menggunakan sintaks sebagai:

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

Apakah mungkin melakukan hal seperti ini?

RSilva
sumber

Jawaban:

81

Anda dapat mengintip ke dalam information_schemaskema. Ini memiliki daftar semua tabel dan semua bidang yang ada dalam tabel. Anda kemudian dapat menjalankan kueri menggunakan informasi yang Anda dapatkan dari tabel ini.

Tabel yang terlibat adalah SCHEMATA, TABLES, dan COLUMNS. Ada kunci asing sedemikian rupa sehingga Anda dapat membangun dengan tepat bagaimana tabel dibuat dalam suatu skema.

Milhous
sumber
49
ini bukan jawaban yang saya inginkan, tetapi saya harus menerima kebenaran. : D Terima kasih
RSilva
1
Ini benar, tetapi jawaban @Dan Rather membantu juga, karena db yang saya lihat adalah pengaturan yang tidak jelas dan saya tidak tahu apa nama kolom atau tabel yang pasti hanya dengan melihat ...
DrCord
12
information_schemaadalah database, bukan tabel. Beberapa klarifikasi pada tabel mana untuk mencari di dalam information_schemaakan baik!
CaptSaltyJack
3
Agak lucu bagi saya bahwa MySql tidak menyediakan cara untuk mencari semua tabel. Sepertinya pilihan yang sangat sederhana
Kolob Canyon
@KolobCanyon MySQL memang memberikan opsi untuk melakukannya melalui SHOW TABLES FROM db_name LIKE 'pattern'
vladkras
442

Anda dapat melakukan salah SQLDumpsatu dari database (dan datanya) kemudian mencari file itu.

Dean Sebaliknya
sumber
20
Jangan lupa Anda bisa menggunakan --extended-insert = FALSE flag untuk mysqldump untuk membuat output lebih mudah dibaca.
Benubird
26
Jika Anda bertanya-tanya, seperti saya, apa komentar pensil tentang: snopes.com/business/genius/spacepen.asp
Jason Swett
2
Ini adalah cara "standar" (de facto) untuk mencari seluruh DB. Saya suka mysqldump -Tyang membuat dua file per tabel dalam direktori yang ditentukan. Saya kemudian grep <search> *di dir, dan apa yang dikembalikan adalah file tablename.txt atau .sql. File txt menyimpan data untuk tabel (tab dibatasi, ganti nama menjadi csv untuk dibuka di Excel), dan sql menampung definisi tabel, Anda dapat menebaknya: SQL. Dengan cara ini Anda mencari semuanya dan mudah untuk mempersempit lokasi data Anda. Metode ini bisa sangat sulit untuk bekerja di lingkungan tertentu. Stack Overflow sangat membantu di sini.
Joel Mellon
Ketika Anda memiliki SQL besar, atau mungkin dalam arsip - Anda dapat membukanya di MC tepat di server, lalu lihat-> Cari
Vitaly Zdanevich
1
Saran yang bagus! Tapi, itu tidak akan berfungsi jika file db dump benar-benar besar (situasi yang saya alami sekarang :))
Boban
207

Jika Anda menginstal phpMyAdmin, gunakan fitur 'Cari'.

  • Pilih DB Anda
  • Pastikan Anda memiliki DB yang dipilih (bukan tabel, jika tidak, Anda akan mendapatkan dialog pencarian yang sama sekali berbeda)
  • Klik tab 'Cari'
  • Pilih istilah pencarian yang Anda inginkan
  • Pilih tabel untuk dicari

Saya telah menggunakan ini pada hingga 250 tabel / 10GB basis data (pada server yang cepat) dan waktu responsnya sangat luar biasa.

Greg Lyon
sumber
8
Salah satu basis data kami adalah 92.7Gb dan opsi ini berfungsi dengan baik. Solusi hebat
Tricky
5
Saya selalu lupa apa yang bisa dilakukan semua phpMyAdmin. Ini alat yang hebat!
Ville
1
Sangat cepat, dan bermanfaat di Magento db saya. Menemukan bidang untuk data yang saya cari dalam beberapa detik, dan juga semua tabel lain yang mereferensikannya.
mtrueblood
1
MySQL Workbench memiliki fitur ini juga: "Database >> Cari Tabel Data ..."
matt wilkie
1
Bagus! sekarang bagaimana Anda mengganti string yang dicari di phpmyadmin?
Pathros
46

Fungsi 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
sumber
Ini pho, bagi mereka yang mungkin tidak tahu.
Nandostyle
Atur $mysqliseperti ini:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor
Juga, saya sangat menyarankan untuk mengganti $columdengan "`$colum`"sehingga bidang yang disediakan kata-kata tidak akan menimbulkan masalah
Adam Taylor
41

Anda dapat menggunakan proyek ini: http://code.google.com/p/anywhereindb

Ini akan mencari semua data di semua tabel.


sumber
Tidak lagi berfungsi untuk PHP7. (mysql_connect ditinggalkan dalam PHP 5.5.0, dihapus dalam PHP 7.0.0)
iDev247
12

Jika Anda menghindari stored proceduresseperti wabah, atau tidak dapat melakukan mysql_dumpkarena izin, atau menjalankan berbagai alasan lainnya.

Saya akan menyarankan pendekatan tiga langkah seperti ini:

1) Di mana kueri ini membangun banyak kueri sebagai set hasil.

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

Hasilnya akan terlihat seperti ini:

Salin hasil ini ke jendela permintaan lain

2) Anda bisa adil Right Clickdan menggunakanCopy Row (tab-separated)

masukkan deskripsi gambar di sini

3) Rekatkan hasil di jendela kueri baru dan jalankan ke isi hati Anda.

Detail: Saya mengecualikan skema sistem yang biasanya tidak Anda lihat di meja kerja kecuali Anda memiliki opsi yang Show Metadata and Internal Schemasdiperiksa.

Saya melakukan ini untuk memberikan cara cepat ke ANALYZEseluruh HOST atau DB jika diperlukan atau menjalankan OPTIMIZEpernyataan untuk mendukung peningkatan kinerja.

Saya yakin ada berbagai cara yang dapat Anda lakukan untuk melakukan ini, tetapi inilah yang bekerja untuk saya:

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

Diuji pada Versi MySQL: 5.6.23

PERINGATAN: JANGAN RUN INI JIKA:

  1. Anda khawatir menyebabkan Table-locks (mengawasi koneksi klien Anda)
  2. Anda tidak yakin dengan apa yang Anda lakukan.

  3. Anda mencoba membuat Anda marah DBA. (Anda mungkin memiliki orang-orang di meja Anda dengan kecepatan .)

Cheers, Jay; -]

JayRizzo
sumber
1
Jelas bukan sesuatu yang ingin Anda jalankan di live db tetapi membantu untuk tugas debugging tertentu. Ini gagal meskipun jika jenis kolom tidak dibandingkan dengan string. Yaitu kolom int.
Michael Thessel
Poin bagus, saya menambahkan tiga alternatif untuk mencari melalui gumpalan, karakter, atau int. Ini hanya Generalisasi dan harus SELALU digunakan dengan HATI-HATI. JANGAN SEKALI pada PRODUKSI seperti yang Anda sebutkan, itulah yang biasanya membuat Anda dipecat "Menemukan skrip di internet dan tidak memahaminya, tetapi masih menjalankannya" tetapi, hei itulah cara orang belajar dengan cara yang sulit.
JayRizzo
8

Saya juga melakukan crawler mysql saya sendiri untuk mencari beberapa konfigurasi wordpress, tidak dapat menemukannya di antarmuka dan database, dan dump database terlalu berat dan tidak dapat dibaca. Saya harus mengatakan saya tidak bisa melakukannya tanpanya sekarang.

Ini berfungsi seperti yang dari @Olivier, tetapi mengelola database eksotis / nama tabel dan LIKE-joker aman.

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

Menjalankan skrip ini dapat menghasilkan sesuatu seperti:

---------------------------------------------------
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
sumber
1
Saya mendapatkan kesalahan ini: Kesalahan fatal: Pengecualian 'PDOException' tanpa pesan 'SQLSTATE [42000]: Kesalahan sintaks atau pelanggaran akses: 1064 Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'key LIKE REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE), REPLACE (' 180well * ',' \\ ',' \\\\), '% ',' pada baris 1 '
LLBBL
6

Ini adalah permintaan paling sederhana untuk membuka kembali semua Kolom dan Tabel

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

Semua tabel atau tabel dengan nama string tertentu dapat dicari melalui tab Pencarian di phpMyAdmin.

Selamat Mencoba ... \ ^. ^ /

aji
sumber
20
dan bagaimana dengan nilainya?
themhz
6

Menggunakan MySQL Workbench mudah untuk memilih beberapa tabel dan menjalankan pencarian teks di semua tabel DB ;-)

Fred Christophe
sumber
Terima kasih! Pertama kali saya menggunakan meja kerja. Cukup intuitif, itu mengarahkan saya ke meja yang saya butuhkan dan saya dapat menemukannya dari sana.
joshmiller
6

Meskipun pertanyaan ini sudah lama, berikut adalah bagaimana Anda bisa melakukannya jika Anda menggunakan mysql workbench 6.3. (Kemungkinan besar itu juga berfungsi untuk versi lain)

Klik kanan skema Anda dan "Cari data tabel", masukkan nilai Anda dan tekan "Mulai Pencarian". Itu dia.

Rpant
sumber
6

Ini solusi saya untuk ini

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é
sumber
1
ketika saya menjalankan CALL findAll('tbl_test','abb'), saya melewatkan kesalahan ini: # 1267 - Campuran ilegal dari kumpulan (utf8_general_ci, IMPLICIT) dan (utf8_unicode_ci, IMPLICIT) untuk operasi '=' Bisakah Anda memperbaikinya? Terima kasih!
Davuz
6

Ini adalah cara sederhana yang saya tahu. Pilih DB Anda di PHPMyAdmin, dan buka tab "Cari" dan tulis apa yang ingin Anda temukan dan di mana Anda akan mencari. Pilih semua tabel jika Anda akan mencari kata-kata dari semua tabel. Lalu "GO" dan lihat hasilnya.Saya Ingin menemukan kata VCD (pintu belakang) dari DB Wordpress saya untuk dihapus

ardan7779
sumber
5

Saya menggunakan HeidiSQL adalah alat yang berguna dan dapat diandalkan yang dirancang untuk pengembang web menggunakan server MySQL yang populer.

Di HeidiSQL Anda dapat menekan shift + ctrl + f dan Anda dapat menemukan teks di server di semua tabel. Opsi ini sangat berguna.

Lev K.
sumber
+1 Tampaknya melakukan pekerjaan dengan baik dan merupakan alat yang berguna yang menyimpan faff yang terlibat dalam beberapa jawaban lainnya. Juga patut dicatat bahwa ini memungkinkan Anda untuk memilih basis data mana yang akan dicari.
Steve Chambers
3

Anda bisa menggunakannya

SHOW TABLES;

Kemudian dapatkan kolom di tabel tersebut (dalam satu lingkaran) dengan

SHOW COLUMNS FROM table;

dan kemudian dengan info itu buat banyak pertanyaan yang Anda juga dapat UNION jika Anda perlu.

Tapi ini sangat berat di database. Khususnya jika Anda melakukan pencarian LIKE.

Ólafur Waage
sumber
SHOW TABLES FROM <db_name>lebih tepat
vladkras
3

Solusi ini
a) hanya MySQL, tidak perlu bahasa lain, dan
b) mengembalikan hasil SQL, siap untuk diproses!

#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
sumber
Untuk solusi semacam ini biasanya menambahkannya ke phpfiddler akan menyenangkan sehingga orang dapat melihat dan bahkan mengomentari solusi Anda. :)
pal4life
Saya mendapatkan kesalahan #1243 - Unknown prepared statement handler (stmt) given to EXECUTEsaat menjalankan kueri Anda di Phpmyadmin untuk mencari di seluruh basis data
Vicky Dev
@VickyDev Saya tahu sudah lebih dari setahun sejak pertanyaan Anda. Maaf. Namun demikian: Saya pikir ada sesuatu yang salah dalam skrip Anda karena stmt dideklarasikan di baris di atas EXECUTE. Versi MySQL mana yang Anda gunakan?
Chonez
2

Saya memodifikasi jawaban PHP dari Olivier sedikit ke:

  • cetak hasil di mana string ditemukan
  • hilangkan tabel tanpa hasil
  • juga tampilkan keluaran jika nama kolom cocok dengan input pencarian
  • tampilkan jumlah total hasil

    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
sumber
1

Saya membangun jawaban sebelumnya dan memiliki ini, beberapa bantalan tambahan hanya untuk dapat dengan mudah bergabung dengan semua output:

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

Pertama Anda menjalankan ini, lalu tempel dan jalankan hasilnya (tanpa pengeditan) dan itu akan menampilkan semua nama tabel dan kolom di mana nilai tersebut digunakan.

Jim Björklund
sumber
1
Empat pemeriksaan pada nilai kolom bukan cara yang paling sederhana. Anda bisa / harus WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')atau bahkan lebih baik, menjalankannya, memeriksa skema yang digunakan, dan mengatur skema yang digunakan di mana bukan termasuk semua yang lain.
bradbury9
1

Saya punya ini untuk bekerja. Anda hanya perlu mengubah variabel

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

Saya telah melakukan ini menggunakan HeidiSQL. Ini tidak mudah ditemukan tetapi dengan menekan Ctrl + Shift + F itu akan menampilkan dialog "table tools". Kemudian pilih apa yang ingin Anda cari (Database lengkap ke tabel tunggal) dan masukkan nilai "Teks untuk menemukan" dan klik "Temukan". Saya menemukannya sangat cepat (870MiB db dalam waktu kurang dari satu menit)

R1CHY_RICH
sumber
0

Saya menggunakan Union untuk merangkai pertanyaan. Tidak tahu apakah ini cara yang paling efisien, tetapi berhasil.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
mrmills129
sumber
Masalah dengan jawaban ini adalah bahwa ada variabel dan jumlah tabel yang tidak dikenal
bradbury9
0

Ada perpustakaan yang bagus untuk membaca semua tabel, 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
sumber
0

Saya tidak tahu apakah ini hanya dalam versi terbaru, tetapi mengklik kanan pada Tablesopsi di Navigatorpanel muncul opsi yang disebut Search Table Data. Ini membuka kotak pencarian tempat Anda mengisi string pencarian dan tekan pencarian.

Anda harus memilih tabel yang ingin Anda cari di panel kiri. Tetapi jika Anda menahan shift dan memilih seperti 10 tabel sekaligus, MySql dapat mengatasinya dan mengembalikan hasilnya dalam hitungan detik.

Bagi siapa pun yang mencari opsi yang lebih baik! :)

Mentimun Gila
sumber
Aplikasi apa yang Anda lakukan semua ini?
Jon Schneider
Dia menggunakan aplikasi Navigator.
Damir Olejar