ค้นหาในทุกฟิลด์จากทุกตารางของฐานข้อมูล MySQL


298

ฉันต้องการที่จะค้นหาในทุกสาขาจากทุกตารางของฐานข้อมูล MySQL สตริงที่กำหนดอาจใช้ไวยากรณ์เป็น:

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

เป็นไปได้ไหมที่จะทำอะไรแบบนี้?


2
บล็อกนี้อาจมีประโยชน์: winashwin.wordpress.com/2012/08/28/mysql-search

คำตอบ:


81

คุณสามารถมองเข้าไปในinformation_schemaสคีมา มีรายการตารางทั้งหมดและเขตข้อมูลทั้งหมดที่อยู่ในตาราง จากนั้นคุณสามารถเรียกใช้คิวรีโดยใช้ข้อมูลที่คุณได้รับจากตารางนี้

ตารางที่เกี่ยวข้องคือ SCHEMATA, TABLES และ COLUMNS มีคีย์ต่างประเทศเช่นที่คุณสามารถสร้างขึ้นอย่างแน่นอนว่าตารางจะถูกสร้างขึ้นในสคีมา


49
นี่ไม่ใช่คำตอบที่ฉันต้องการ แต่ฉันต้องยอมรับความจริง : D ขอบคุณ
RSilva

1
สิ่งนี้ถูกต้อง แต่คำตอบของ @Dan Rather ก็ช่วยด้วยเช่นกันเพราะฐานข้อมูลที่ฉันดูผ่านการตั้งค่าไม่ชัดเจนและฉันไม่สามารถรู้ได้ว่าชื่อคอลัมน์หรือตารางจะเป็นอย่างไรโดยดู ...
DrCord

12
information_schemaเป็นฐานข้อมูลไม่ใช่ตาราง คำอธิบายบางอย่างเกี่ยวกับตารางการค้นหาภายในinformation_schemaจะดี!
CaptSaltyJack

3
มันเป็นเรื่องตลกสำหรับฉันที่ MySql ไม่ได้ให้วิธีการค้นหาตารางทั้งหมด ดูเหมือนว่าจะเป็นตัวเลือกที่ค่อนข้างดี
Kolob Canyon

@KolobCanyon MySQL มีตัวเลือกให้ทำผ่านSHOW TABLES จาก db_name LIKE 'pattern'
vladkras

442

คุณสามารถทำหนึ่งSQLDumpในฐานข้อมูล (และข้อมูล) จากนั้นค้นหาไฟล์นั้น


20
อย่าลืมว่าคุณสามารถใช้แฟล็ก --extended-insert = FALSE สำหรับ mysqldump เพื่อให้เอาต์พุตอ่านง่ายขึ้น
Benubird

26
ในกรณีที่คุณสงสัยเช่นเดียวกับฉันความคิดเห็นเกี่ยวกับดินสอเป็นอย่างไร: snopes.com/business/genius/spacepen.asp
Jason Swett

2
นี่คือวิธี "มาตรฐาน" (พฤตินัย) เพื่อค้นหาฐานข้อมูลทั้งหมด ฉันชอบmysqldump -Tที่สร้างสองไฟล์ต่อตารางในไดเรกทอรีที่ระบุ ฉันgrep <search> *อยู่ใน dir และสิ่งที่ส่งคืนคือไฟล์ tablename.txt หรือ. sql ไฟล์ txt เก็บข้อมูลสำหรับตาราง (คั่นด้วยแท็บเปลี่ยนชื่อเป็น csv เพื่อเปิดใน Excel) และ sql เก็บคำจำกัดความของตารางในคุณเดาได้: SQL วิธีนี้คุณกำลังค้นหาทุกสิ่งและง่ายต่อการ จำกัด ตำแหน่งของข้อมูลของคุณ วิธีนี้ค่อนข้างยากที่จะทำงานในบางสภาพแวดล้อม Stack Overflow มีประโยชน์มากที่นี่
Joel Mellon

เมื่อคุณมี SQL ขนาดใหญ่หรืออาจอยู่ในที่เก็บถาวร - คุณสามารถเปิดใน MC ได้ทางเซิร์ฟเวอร์จากนั้นดู
Vitaly Zdanevich

1
คำแนะนำที่ดี! แต่มันจะไม่ทำงานหากไฟล์ db dump มีขนาดใหญ่มาก (สถานการณ์ที่ฉันมีตอนนี้ :))
Boban

207

หากคุณติดตั้ง phpMyAdmin ให้ใช้คุณสมบัติ 'ค้นหา'

  • เลือก DB ของคุณ
  • ตรวจสอบให้แน่ใจว่าคุณได้เลือก DB แล้ว (เช่นไม่ใช่ตารางมิฉะนั้นคุณจะได้รับกล่องโต้ตอบการค้นหาที่แตกต่างอย่างสิ้นเชิง)
  • คลิกที่แท็บ 'ค้นหา'
  • เลือกคำค้นหาที่คุณต้องการ
  • เลือกตารางที่จะค้นหา

ฉันใช้สิ่งนี้กับฐานข้อมูล 250 ตาราง / 10GB (บนเซิร์ฟเวอร์ที่เร็ว) และเวลาตอบสนองนั้นสั้นมาก


8
หนึ่งในฐานข้อมูลของเราคือ 92.7Gb และตัวเลือกนี้ใช้งานได้ดี ทางออกที่ดี
Tricky

5
ฉันลืมเสมอว่า phpMyAdmin ทั้งหมดสามารถทำอะไรได้บ้าง มันเป็นเครื่องมือที่ยอดเยี่ยม!
วิลล์

1
เร็วมากและมีประโยชน์ในฐานข้อมูลวีโอไอพีของฉัน พบฟิลด์สำหรับข้อมูลที่ฉันค้นหาในสองสามวินาทีและตารางอื่น ๆ ทั้งหมดที่อ้างถึง
mtrueblood

1
MySQL Workbench มีคุณสมบัตินี้เช่นกัน: "ฐานข้อมูล >> ค้นหาตารางข้อมูล ... "
matt wilkie

1
ดี! ตอนนี้คุณจะแทนที่สตริงการค้นหาใน phpmyadmin อย่างไร
Pathros

46

ฟังก์ชั่น 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;
}

นี่คือโพธิ์สำหรับผู้ที่อาจไม่ทราบ
Nandostyle

ตั้ง$mysqliเช่นนี้:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor

นอกจากนี้ฉันขอแนะนำให้แทนที่$columด้วย"`$colum`"เพื่อให้ฟิลด์ที่เป็นคำสงวนไม่ทำให้เกิดปัญหา
Adam Taylor

41

คุณสามารถใช้โครงการนี้: http://code.google.com/p/anywhereindb

นี่จะค้นหาข้อมูลทั้งหมดในตารางทั้งหมด


ไม่สามารถใช้งานกับ PHP7 ได้อีกต่อไป (mysql_connect เลิกใช้แล้วใน PHP 5.5.0, ถูกลบใน PHP 7.0.0)
iDev247

12

หากคุณกำลังหลีกเลี่ยงstored proceduresเช่นโรคระบาดหรือไม่สามารถทำได้mysql_dumpเนื่องจากสิทธิ์หรือทำงานด้วยเหตุผลอื่น ๆ

ฉันขอแนะนำวิธีสามขั้นตอนดังนี้:

1) โดยที่แบบสอบถามนี้สร้างกลุ่มของแบบสอบถามเป็นชุดผลลัพธ์

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

ผลลัพธ์ควรมีลักษณะเช่นนี้:

คัดลอกผลลัพธ์เหล่านี้ลงในหน้าต่างแบบสอบถามอื่น

2) จากนั้นคุณสามารถRight Clickใช้และCopy Row (tab-separated)

ป้อนคำอธิบายรูปภาพที่นี่

3) วางผลลัพธ์ในหน้าต่างแบบสอบถามใหม่และเรียกใช้กับเนื้อหาในหัวใจของคุณ

รายละเอียด: ฉันไม่รวมสคีมาของระบบที่คุณมักจะไม่เห็นใน workbench ของคุณเว้นแต่คุณจะShow Metadata and Internal Schemasตรวจสอบตัวเลือกแล้ว

ฉันทำสิ่งนี้เพื่อมอบวิธีที่รวดเร็วในANALYZEHOST หรือ DB ทั้งหมดหากจำเป็นหรือเพื่อเรียกใช้OPTIMIZEคำสั่งเพื่อสนับสนุนการปรับปรุงประสิทธิภาพ

ฉันแน่ใจว่ามีวิธีที่แตกต่างกันคุณอาจไปเกี่ยวกับการทำเช่นนี้ แต่นี่คือสิ่งที่ได้ผลสำหรับฉัน:

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

ทดสอบกับ MySQL เวอร์ชั่น: 5.6.23

คำเตือน: อย่าเรียกใช้สิ่งนี้หาก:

  1. คุณกังวลเกี่ยวกับการก่อให้เกิดตารางล็อค (คอยดูการเชื่อมต่อลูกค้าของคุณ)
  2. คุณไม่แน่ใจเกี่ยวกับสิ่งที่คุณกำลังทำ

  3. คุณกำลังพยายามที่จะทำให้คุณโกรธ DBA (คุณอาจมีคนที่โต๊ะทำงานด้วยความรวดเร็ว )

ไชโยเจ; -]


1
ไม่ใช่สิ่งที่คุณต้องการเรียกใช้บน db จริง แต่เป็นประโยชน์สำหรับงานการดีบักบางอย่าง สิ่งนี้จะล้มเหลวแม้ว่าประเภทคอลัมน์จะไม่เปรียบเทียบกับสตริง นั่นคือคอลัมน์ int
Michael Thessel

จุดที่ดีฉันเพิ่มสามทางเลือกในการค้นหาผ่าน blobs, chars หรือ ints นี่เป็นเพียงการทั่วไปและควรใช้กับข้อควรระวังเสมอ ไม่เคยมีผลงานตามที่คุณพูดถึงซึ่งโดยปกติแล้วคือสิ่งที่ทำให้คุณถูกไล่ออก "ค้นหาสคริปต์บนอินเทอร์เน็ตและไม่เข้าใจพวกเขา แต่ยังคงใช้งานพวกเขาอยู่" แต่นี่คือวิธีที่ผู้คนเรียนรู้วิธีที่ยากลำบาก
JayRizzo

8

ฉันยังได้ mysql crawler ของตัวเองเพื่อค้นหาการตั้งค่า wordpress บางอย่างไม่สามารถหาได้ทั้งในส่วนต่อประสานและฐานข้อมูลและการทิ้งฐานข้อมูลหนักเกินไปและอ่านไม่ได้ ฉันต้องบอกว่าฉันทำไม่ได้ถ้าไม่มีมัน

มันทำงานได้เหมือนจาก @Olivier แต่จัดการชื่อฐานข้อมูล / ตารางที่แปลกใหม่และปลอดภัยเหมือน 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++;
    }
}

การรันสคริปต์นี้สามารถแสดงผลได้ดังนี้:

---------------------------------------------------
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
ฉันได้รับข้อผิดพลาดนี้: ข้อผิดพลาดร้ายแรง: มีข้อยกเว้น 'PDOException' ที่ยังไม่ได้อ่าน 'SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1064 คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ; ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้กับ 'key LIKE REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (' 180well * ',' \\ ',' \\\\ '),'% ',' ที่บรรทัด 1 '
LLBBL

6

นี่เป็นแบบสอบถามที่ง่ายที่สุดในการกู้คืนคอลัมน์และตารางทั้งหมด

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

สามารถค้นหาตารางทั้งหมดหรือตารางที่มีชื่อเฉพาะผ่านทางแท็บค้นหาใน phpMyAdmin

มีแบบสอบถามที่ดี ... \ ^. ^ /


20
และวิธีการเกี่ยวกับค่าหรือไม่
themhz

6

การใช้ MySQL Workbench ง่ายต่อการเลือกหลายตารางและเรียกใช้การค้นหาข้อความในตารางทั้งหมดของ DB ;-)


ขอบคุณ! ครั้งแรกที่ฉันใช้ workbench ค่อนข้างใช้งานง่ายมันชี้ไปที่ตารางที่ฉันต้องการและฉันสามารถค้นหาได้จากตรงนั้น
joshmiller

6

แม้ว่าคำถามนี้จะเก่า แต่นี่เป็นวิธีที่คุณสามารถทำได้ถ้าคุณใช้ mysql workbench 6.3 (ส่วนใหญ่มีแนวโน้มที่จะใช้งานได้กับรุ่นอื่น ๆ

คลิกขวาที่สคีมาของคุณและ "ค้นหาข้อมูลตาราง" ป้อนค่าของคุณแล้วกด "เริ่มการค้นหา" แค่นั้นแหละ.


6

นี่คือทางออกของฉันสำหรับสิ่งนี้

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
เมื่อฉันเรียกใช้CALL findAll('tbl_test','abb')ฉันพลาดข้อผิดพลาดนี้: # 1267 - การผสมที่ผิดกฎหมาย (utf8_general_ci, IMPLICIT) และ (utf8_unicode_ci, IMPLICIT) สำหรับการดำเนินการ '='คุณสามารถแก้ไขได้หรือไม่ ขอบคุณ!
Davuz

6

นี่เป็นวิธีง่ายๆที่ฉันรู้ เลือก DB ของคุณใน PHPMyAdmin และไปที่แท็บ "ค้นหา" และเขียนสิ่งที่คุณต้องการค้นหาและตำแหน่งที่คุณต้องการค้นหา เลือกตารางทั้งหมดถ้าคุณจะค้นหาคำจากตารางทั้งหมด จากนั้น "ไป" และดูผลลัพธ์ฉันต้องการค้นหาคำว่า VCD (แบ็คดอร์) จาก Wordpress DB ของฉันเพื่อลบ


5

ฉันใช้ HeidiSQL เป็นเครื่องมือที่มีประโยชน์และเชื่อถือได้ออกแบบมาสำหรับนักพัฒนาเว็บโดยใช้เซิร์ฟเวอร์ MySQL ที่เป็นที่นิยม

ใน HeidiSQL คุณสามารถกด Shift + ctrl + f และคุณสามารถค้นหาข้อความบนเซิร์ฟเวอร์ในทุกตาราง ตัวเลือกนี้มีประโยชน์มาก


+1 ดูเหมือนว่าจะทำงานได้ดีและเป็นเครื่องมือที่มีประโยชน์ที่ช่วยให้ faff ที่เกี่ยวข้องกับคำตอบอื่น ๆ นอกจากนี้ยังมีข้อสังเกตว่าจะช่วยให้คุณสามารถเลือกฐานข้อมูลที่ต้องการค้นหาได้
Steve Chambers

3

คุณสามารถใช้

SHOW TABLES;

จากนั้นรับคอลัมน์ในตารางเหล่านั้น (เป็นวง) ด้วย

SHOW COLUMNS FROM table;

จากนั้นข้อมูลดังกล่าวจะสร้างข้อความค้นหาจำนวนมากซึ่งคุณสามารถใช้กับ UNION ได้หากคุณต้องการ

แต่นี่เป็นเรื่องที่หนักมากในฐานข้อมูล พิเศษถ้าคุณกำลังค้นหา LIKE


SHOW TABLES FROM <db_name>แม่นยำยิ่งขึ้น
vladkras

3

โซลูชันนี้
ก) เป็นเพียง MySQL ไม่จำเป็นต้องใช้ภาษาอื่นและ
b) ส่งคืนผลลัพธ์ SQL พร้อมสำหรับการประมวลผล!

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

สำหรับโซลูชั่นประเภทนี้มักจะเพิ่มให้กับ phpfiddler จะดีดังนั้นคนสามารถดูและแสดงความคิดเห็นในการแก้ปัญหาของคุณ :)
pal4life

ฉันได้รับข้อผิดพลาด#1243 - Unknown prepared statement handler (stmt) given to EXECUTEเมื่อฉันเรียกใช้แบบสอบถามของคุณใน Phpmyadmin สำหรับการค้นหาในฐานข้อมูลทั้งหมด
Vicky Dev

@VickyDev ฉันรู้ว่าคำถามของคุณมานานกว่าหนึ่งปีแล้ว ขอโทษ อย่างไรก็ตาม: ฉันคิดว่ามีบางอย่างผิดปกติในสคริปต์ของคุณเนื่องจาก stmt ได้รับการประกาศในแถวด้านบน EXECUTE คุณใช้ MySQL รุ่นไหน
Chonez

2

ฉันแก้ไขคำตอบ PHP ของ Olivier สักเล็กน้อยเป็น:

  • พิมพ์ผลลัพธ์ที่พบสตริง
  • ละเว้นตารางที่ไม่มีผลลัพธ์
  • แสดงผลลัพธ์หากชื่อคอลัมน์ตรงกับอินพุตการค้นหา
  • แสดงจำนวนผลลัพธ์ทั้งหมด

    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

ฉันสร้างขึ้นจากคำตอบก่อนหน้าและมีสิ่งนี้ช่องว่างภายในเพิ่มเติมบางอย่างเพียงเพื่อให้สามารถเข้าร่วมผลลัพธ์ทั้งหมด:

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

ก่อนอื่นให้คุณเรียกใช้แล้ววางและเรียกใช้ผลลัพธ์ (ไม่มีการแก้ไข) และจะแสดงชื่อตารางและคอลัมน์ทั้งหมดที่ใช้ค่า


1
การตรวจสอบสี่ค่าของคอลัมน์ไม่ใช่วิธีที่ง่ายที่สุด คุณสามารถ / WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')หรือควรที่จะดีกว่าดำเนินการตรวจสอบสคีมาที่ใช้และตั้งสคีมาที่ใช้ในตำแหน่งที่ไม่รวมรายการอื่น ๆ ทั้งหมด
bradbury9

1

ฉันได้รับสิ่งนี้ในการทำงาน คุณแค่ต้องเปลี่ยนตัวแปร

$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

ฉันทำสิ่งนี้โดยใช้ HeidiSQL มันไม่ง่ายที่จะหา แต่ด้วยการกด Ctrl + Shift + F มันจะแสดงกล่องโต้ตอบ "เครื่องมือตาราง" จากนั้นเลือกสิ่งที่คุณต้องการค้นหา (ฐานข้อมูลแบบเต็มเป็นตารางเดี่ยว) และป้อนค่า "ข้อความเพื่อค้นหา" แล้วคลิก "ค้นหา" ฉันพบว่ามันรวดเร็วอย่างน่าประหลาดใจ (870MiB db ในเวลาน้อยกว่าหนึ่งนาที)


0

ฉันใช้ Union เพื่อรวมข้อความค้นหาเข้าด้วยกัน ไม่ทราบว่าเป็นวิธีที่มีประสิทธิภาพมากที่สุดหรือไม่ แต่ใช้งานได้

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

ปัญหากับคำตอบนี้คือมีตัวแปรและจำนวนที่ไม่ทราบตาราง
bradbury9

0

มีห้องสมุดที่ดีสำหรับการอ่านตารางทั้งหมด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

ฉันไม่รู้ว่านี่เป็นเพียงรุ่นล่าสุดหรือไม่ แต่การคลิกขวาที่TablesตัวเลือกในNavigatorบานหน้าต่างจะปรากฏตัวเลือกSearch Table Dataขึ้นมา สิ่งนี้จะเปิดช่องค้นหาที่คุณกรอกข้อมูลในสตริงการค้นหาและกดค้นหา

คุณต้องเลือกตารางที่คุณต้องการค้นหาในบานหน้าต่างด้านซ้าย แต่ถ้าคุณกด shift ค้างไว้และเลือกจำนวน 10 ตารางต่อครั้ง MySql สามารถจัดการกับมันและส่งคืนผลลัพธ์ในไม่กี่วินาที

สำหรับทุกคนที่กำลังมองหาตัวเลือกที่ดีกว่า! :)


คุณกำลังทำสิ่งทั้งหมดนี้อยู่ในแอปพลิเคชัน
Jon Schneider

เขากำลังใช้แอปพลิเคชัน Navigator
Damir Olejar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.