Tìm kiếm trong tất cả các trường từ mọi bảng của cơ sở dữ liệu MySQL


298

Tôi muốn tìm kiếm trong tất cả các trường từ tất cả các bảng của cơ sở dữ liệu MySQL một chuỗi đã cho, có thể sử dụng cú pháp như:

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

Có thể làm một cái gì đó như thế này?


2
Blog này có thể hữu ích: winashwin.wordpress.com/2012/08/28/mysql-search

Câu trả lời:


81

Bạn có thể nhìn trộm vào information_schema lược đồ. Nó có một danh sách tất cả các bảng và tất cả các trường trong một bảng. Sau đó, bạn có thể chạy truy vấn bằng cách sử dụng thông tin mà bạn đã nhận được từ bảng này.

Các bảng liên quan là SCHEMATA, BẢNG và MÀU SẮC. Có các khóa ngoại để bạn có thể xây dựng chính xác cách các bảng được tạo trong một lược đồ.


49
đây không phải là câu trả lời mà tôi muốn, nhưng tôi phải chấp nhận sự thật. : D Cảm ơn bạn
RSilva

1
Điều này đúng, nhưng câu trả lời của @Dan Thay cũng giúp, bởi vì db tôi đang xem qua được thiết lập một cách khó hiểu và tôi không thể biết được tên cột hoặc bảng sẽ chắc chắn chỉ bằng cách nhìn ...
DrCord

12
information_schemalà một cơ sở dữ liệu, không phải là một bảng. Một số làm rõ trên bảng nào để tìm kiếm trong information_schemasẽ tốt!
CaptSaltyJack

3
Thật là buồn cười với tôi khi MySql không cung cấp cách nào để tìm kiếm tất cả các bảng. Có vẻ như là một lựa chọn khá thô sơ
Kolob Canyon

@KolobCanyon MySQL không cung cấp tùy chọn để thực hiện điều đó thông qua SHOW BẢNG TỪ db_name THÍCH 'mẫu'
vladkras

442

Bạn có thể thực hiện một SQLDumpcơ sở dữ liệu (và dữ liệu của nó) sau đó tìm kiếm tệp đó.


20
Đừng quên bạn có thể sử dụng cờ --extends-insert = FALSE cho mysqldump để làm cho đầu ra dễ đọc hơn.
Benubird

26
Trong trường hợp bạn đang tự hỏi, giống như tôi, nhận xét về bút chì là gì: snopes.com/business/genius/spacepen.asp
Jason Swett

2
Đây là cách "tiêu chuẩn" (thực tế) để tìm kiếm toàn bộ DB. Tôi thích mysqldump -Tmà tạo hai tệp trên mỗi bảng trong một thư mục được chỉ định. Tôi sau đó grep <search> *trong thư mục và những gì được trả về là tệp tablename.txt hoặc .sql. Tệp txt giữ dữ liệu cho bảng (được phân định bằng tab, đổi tên thành csv để mở trong Excel) và sql giữ định nghĩa bảng trong, bạn đoán nó: SQL. Bằng cách này, bạn đang tìm kiếm mọi thứ và thật dễ dàng để thu hẹp dữ liệu của bạn. Phương pháp này có thể khá khó khăn để làm việc trong một số môi trường nhất định. Stack Overflow rất hữu ích ở đây.
Joel Mellon

Khi bạn có SQL lớn, hoặc có thể trong kho lưu trữ - bạn có thể mở nó trong MC ngay trên máy chủ, sau đó xem-> Tìm kiếm
Vitaly Zdanevich

1
Đề nghị tốt đẹp! Nhưng, nó sẽ không hoạt động nếu tệp kết xuất db thực sự lớn (tình huống mà tôi hiện đang có :))
Boban

207

Nếu bạn đã cài đặt phpMyAdmin, hãy sử dụng tính năng 'Tìm kiếm' của nó.

  • Chọn DB của bạn
  • Hãy chắc chắn rằng bạn đã chọn DB (nghĩa là không phải bảng, nếu không bạn sẽ nhận được hộp thoại tìm kiếm hoàn toàn khác)
  • Nhấp vào tab 'Tìm kiếm'
  • Chọn thuật ngữ tìm kiếm bạn muốn
  • Chọn các bảng để tìm kiếm

Tôi đã sử dụng điều này trên tối đa 250 bảng / cơ sở dữ liệu 10 GB (trên máy chủ nhanh) và thời gian phản hồi không có gì đáng ngạc nhiên.


8
Một trong những cơ sở dữ liệu của chúng tôi là 92,7Gb và tùy chọn này hoạt động tốt. Giải pháp tuyệt vời
Tricky

5
Tôi luôn quên những gì tất cả phpMyAdmin có thể làm. Đó là một công cụ tuyệt vời!
Ville

1
Vô cùng nhanh chóng và hữu ích trong db Magento của tôi. Tìm thấy trường cho dữ liệu tôi đang tìm kiếm trong vài giây và tất cả các bảng khác đang tham chiếu nó.
mtrueblood

1
MySQL Workbench cũng có tính năng này: "Cơ sở dữ liệu >> Dữ liệu bảng tìm kiếm ..."
matt wilkie

1
Đẹp! Bây giờ bạn sẽ thay thế chuỗi tìm kiếm trong phpmyadmin như thế nào?
Pathros

46

Hàm 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;
}

Đây là món phở, dành cho những ai chưa biết.
Nandostyle

Đặt $mysqlinhư thế này:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor

Ngoài ra, tôi đặc biệt khuyên bạn nên thay thế $columbằng "`$colum`"để các trường được dành riêng từ sẽ không gây ra sự cố
Adam Taylor

41

Bạn có thể sử dụng dự án này: http://code.google.com.vn/p/anywhereindb

Điều này sẽ tìm kiếm tất cả các dữ liệu trong tất cả các bảng.


Không còn hoạt động cho PHP7. (mysql_connect không dùng nữa trong PHP 5.5.0, đã bị xóa trong PHP 7.0.0)
iDev247

12

Nếu bạn đang tránh stored proceduresnhư bệnh dịch hạch, hoặc không thể thực hiện mysql_dumpdo quyền hoặc do các lý do khác nhau.

Tôi muốn đề xuất một cách tiếp cận ba bước như thế này:

1) Trường hợp truy vấn này xây dựng một loạt các truy vấn như một tập kết quả.

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

Kết quả sẽ như thế này:

Sao chép các kết quả này vào một cửa sổ truy vấn khác

2) Sau đó, bạn có thể chỉ Right Clickvà sử dụngCopy Row (tab-separated)

nhập mô tả hình ảnh ở đây

3) Dán kết quả vào cửa sổ truy vấn mới và chạy đến nội dung trái tim của bạn.

Chi tiết: Tôi loại trừ lược đồ hệ thống mà bạn có thể không thường thấy trong bàn làm việc của mình trừ khi bạn có tùy chọn Show Metadata and Internal Schemasđược chọn .

Tôi đã làm điều này để cung cấp một cách nhanh chóng cho ANALYZEtoàn bộ HOST hoặc DB nếu cần hoặc để chạy các OPTIMIZEcâu lệnh để hỗ trợ cải thiện hiệu suất.

Tôi chắc chắn có nhiều cách khác nhau bạn có thể thực hiện việc này nhưng đây là những cách phù hợp với tôi:

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

Đã thử nghiệm trên phiên bản MySQL: 5.6.23

CẢNH BÁO: KHÔNG CHẠY NÀY NẾU:

  1. Bạn lo ngại về việc gây ra Khóa bảng (để mắt đến các kết nối máy khách của bạn)
  2. Bạn không chắc chắn về những gì bạn đang làm.

  3. Bạn đang cố gắng chọc giận bạn DBA. (bạn có thể có người ở bàn làm việc với sự nhanh chóng .)

Chúc mừng, Jay; -]


1
Chắc chắn không phải thứ gì đó bạn muốn chạy trên db trực tiếp nhưng hữu ích cho các tác vụ gỡ lỗi nhất định. Điều này không thành công nếu kiểu cột không so sánh với chuỗi. Tức là một cột int.
Michael Margarel

Điểm tuyệt vời, tôi đã thêm ba lựa chọn thay thế để tìm kiếm các đốm màu, ký tự hoặc ints. Đây chỉ là một Tổng quát hóa và LUÔN LUÔN nên được sử dụng với THẬN TRỌNG. KHÔNG BAO GIỜ về SẢN XUẤT như bạn đã đề cập, đó thường là điều khiến bạn bị sa thải "Tìm kiếm các tập lệnh trên internet và không hiểu chúng, nhưng vẫn chạy chúng", nhưng đó là cách mọi người học một cách khó khăn.
JayRizzo

8

Tôi cũng đã thực hiện trình thu thập thông tin mysql của riêng mình để tìm kiếm một số cấu hình wordpress, không thể tìm thấy nó trong cả giao diện và cơ sở dữ liệu, và các cơ sở dữ liệu quá nặng và không thể đọc được. Tôi phải nói rằng tôi không thể làm gì nếu không có nó ngay bây giờ.

Nó hoạt động giống như từ @Olivier, nhưng nó quản lý cơ sở dữ liệu / tên bảng kỳ lạ và an toàn cho THÍCH-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++;
    }
}

Chạy tập lệnh này có thể xuất ra một cái gì đó như:

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

1
Tôi gặp lỗi này: Lỗi nghiêm trọng: Đã hủy ngoại lệ 'PDOException' với thông báo 'SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm truy cập: 1064 Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần 'khóa THÍCH REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (' 180well * ',' \\ ',' \\\\ '),'% ',' tại dòng 1 '
LLBBL

6

Đây là truy vấn đơn giản nhất để truy xuất lại tất cả các Cột và Bảng

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

Tất cả các bảng hoặc những bảng có chuỗi cụ thể trong tên có thể được tìm kiếm thông qua tab Tìm kiếm trong phpMyAdmin.

Có truy vấn đẹp ... \ ^. ^ /


20
và làm thế nào về các giá trị?
themhz

6

Sử dụng MySQL Workbench, thật dễ dàng để chọn một số bảng và chạy tìm kiếm văn bản trong tất cả các bảng của DB ;-)


Cảm ơn bạn! Lần đầu tiên tôi đã sử dụng bàn làm việc. Khá trực quan, nó chỉ tôi đến cái bàn tôi cần và tôi có thể xác định vị trí của nó từ đó.
joshmiller

6

Mặc dù câu hỏi này đã cũ, đây là cách bạn có thể làm điều đó nếu bạn đang sử dụng mysql workbench 6.3. (Nhiều khả năng nó cũng hoạt động cho các phiên bản khác)

Nhấp chuột phải vào lược đồ của bạn và "Dữ liệu bảng tìm kiếm", nhập giá trị của bạn và nhấn "Bắt đầu tìm kiếm". Đó là nó.


6

Đây là giải pháp của tôi cho việc này

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;

1
Khi tôi chạy CALL findAll('tbl_test','abb'), tôi bỏ lỡ lỗi này: # 1267 - Hỗn hợp bất hợp pháp (utf8_general_ci, IMPLICIT) và (utf8_unicode_ci, IMPLICIT) cho hoạt động '=' Bạn có thể sửa nó không? Cảm ơn!
Davuz

6

Đây là cách đơn giản mà tôi biết. Chọn DB của bạn trong PHPMyAdmin và chuyển đến tab "Tìm kiếm" và viết những gì bạn muốn tìm và nơi bạn sẽ tìm kiếm. Chọn tất cả các bảng nếu bạn sẽ tìm kiếm các từ trong tất cả các bảng. Sau đó "GO" và xem kết quả.Tôi muốn tìm từ VCD (cửa sau) từ DB Wordpress của mình để xóa


5

Tôi đang sử dụng HeidiSQL là một công cụ hữu ích và đáng tin cậy được thiết kế cho các nhà phát triển web sử dụng máy chủ MySQL phổ biến.

Trong HeidiSQL, bạn có thể đẩy shift + ctrl + f và bạn có thể tìm thấy văn bản trên máy chủ trong tất cả các bảng. Tùy chọn này rất hữu ích.


+1 Có vẻ để thực hiện công việc tốt và là một công cụ hữu ích giúp tiết kiệm faff liên quan đến một số câu trả lời khác. Cũng đáng lưu ý rằng nó cho phép bạn chọn (các) cơ sở dữ liệu để tìm kiếm.
Steve Chambers

3

Bạn đã có thể sử dụng

SHOW TABLES;

Sau đó lấy các cột trong các bảng đó (trong một vòng lặp) với

SHOW COLUMNS FROM table;

và sau đó với thông tin đó tạo ra nhiều truy vấn mà bạn cũng có thể UNION nếu bạn cần.

Nhưng điều này là vô cùng nặng nề trên cơ sở dữ liệu. Đặc biệt nếu bạn đang thực hiện một tìm kiếm THÍCH.


SHOW TABLES FROM <db_name>chính xác hơn
vladkras

3

Giải pháp này
a) chỉ là MySQL, không cần ngôn ngữ nào khác và
b) trả về kết quả SQL, sẵn sàng xử lý!

#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;

Đối với các loại giải pháp này, thường thêm chúng vào phpfiddler sẽ rất tốt để mọi người có thể xem và thậm chí nhận xét về giải pháp của bạn. :)
pal4life

Tôi gặp lỗi #1243 - Unknown prepared statement handler (stmt) given to EXECUTEkhi chạy truy vấn của bạn trong Phpmyadmin vì đã tìm kiếm trong toàn bộ cơ sở dữ liệu
Vicky Dev

@VickyDev Tôi biết đã hơn một năm kể từ câu hỏi của bạn. Lấy làm tiếc. Tuy nhiên: Tôi nghĩ có gì đó không đúng trong kịch bản của bạn vì stmt được khai báo ở hàng trên EXECUTE. Phiên bản nào của MySQL bạn đang sử dụng?
Chonez

2

Tôi đã sửa đổi câu trả lời PHP của Olivier một chút thành:

  • in ra kết quả mà chuỗi được tìm thấy
  • bỏ qua các bảng mà không có kết quả
  • cũng hiển thị đầu ra nếu tên cột khớp với đầu vào tìm kiếm
  • hiển thị tổng số kết quả

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

1

Tôi đã xây dựng trên một câu trả lời trước đó và có câu trả lời này, một số phần đệm thêm chỉ để có thể thuận tiện tham gia tất cả đầu ra:

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

Đầu tiên bạn chạy cái này, sau đó dán vào và chạy kết quả (không chỉnh sửa) và nó sẽ hiển thị tất cả các tên bảng và cột trong đó giá trị được sử dụng.


1
Bốn kiểm tra trên một giá trị cột không phải là cách đơn giản nhất. Bạn có thể / nên WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')hoặc thậm chí tốt hơn, thực hiện nó, kiểm tra các lược đồ được sử dụng và đặt lược đồ được sử dụng ở nơi thay vì loại trừ tất cả các lược đồ khác.
bradbury9

1

tôi đã làm việc này bạn chỉ cần thay đổi các biến

$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>";

1

Tôi đã làm điều này bằng cách sử dụng HeidiSQL. Không dễ tìm nhưng bằng cách nhấn Ctrl + Shift + F, nó sẽ hiển thị hộp thoại "công cụ bảng". Sau đó chọn những gì bạn muốn tìm kiếm (Toàn bộ cơ sở dữ liệu vào một bảng) và nhập giá trị "Văn bản cần tìm" và nhấp vào "Tìm". Tôi tìm thấy nó nhanh đáng ngạc nhiên (870MiB db trong vòng chưa đầy một phút)


0

Tôi đã sử dụng Union để xâu chuỗi các truy vấn lại với nhau. Không biết đó là cách hiệu quả nhất, nhưng nó hoạt động.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';

Vấn đề với câu trả lời này là có một số lượng bảng và số lượng không thay đổi
bradbury9

0

Có một thư viện đẹp để đọc tất cả các bảng, 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

}

0

Tôi không biết nếu điều này chỉ có trong các phiên bản gần đây, nhưng nhấp chuột phải vào Tablestùy chọn trong Navigatorkhung sẽ bật lên một tùy chọn được gọi Search Table Data. Điều này sẽ mở ra một hộp tìm kiếm nơi bạn điền vào chuỗi tìm kiếm và nhấn tìm kiếm.

Bạn cần phải chọn bảng bạn muốn tìm kiếm ở khung bên trái. Nhưng nếu bạn giữ phím shift và chọn như 10 bảng cùng một lúc, MySql có thể xử lý điều đó và trả về kết quả sau vài giây.

Đối với bất cứ ai đang tìm kiếm lựa chọn tốt hơn! :)


Ứng dụng nào bạn đang làm tất cả những điều này trong?
Jon Schneider

Anh ta đang sử dụng ứng dụng Navigator.
Damir Olejar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.