एक 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
थैंक्यू

1
यह सही है, लेकिन @ रदर के जवाब ने भी मदद की, क्योंकि मैं जिस डीबी के माध्यम से देख रहा था, वह अस्पष्ट रूप से सेटअप था और मैं यह पता नहीं लगा सका कि कॉलम का नाम या तालिका केवल देखने से क्या होगा ...
DrCord

12
information_schemaएक डेटाबेस है, तालिका नहीं है। किस खोज पर कुछ स्पष्टीकरण information_schemaअच्छा होगा!
CaptSaltyJack

3
यह मेरे लिए प्रफुल्लित करने वाला है कि MySql ने सभी तालिकाओं को खोजने का कोई तरीका प्रदान नहीं किया। एक सुंदर अल्पविकसित विकल्प की तरह लगता है
Kolob Canyon

@KolobCanyon MySQL इसे db_name LIKE 'पैटर्न' के
vladkras

442

आप एक SQLDumpडेटाबेस (और उसके डेटा) कर सकते हैं फिर उस फ़ाइल को खोजें।


20
मत भूलो कि आप आउटपुट को अधिक पठनीय बनाने के लिए mysqldump के लिए --extended-insert = FALSE ध्वज का उपयोग कर सकते हैं।
बेनुबर्ड

26
मामले में आप सोच रहे हैं, जैसे मैं था, पेंसिल टिप्पणी क्या है: snopes.com/business/genius/spacepen.asp
जेसन स्विट

2
यह संपूर्ण डीबी की खोज करने का "मानक" (वास्तविक) तरीका है। मुझे पसंद है mysqldump -Tजो एक निर्दिष्ट निर्देशिका में प्रति तालिका दो फाइलें बनाता है। मैं तो grep <search> *dir में हूँ, और जो लौटा है वह tablename.txt या .sql फ़ाइल है। Txt फ़ाइल तालिका के लिए डेटा रखती है (टैब सीमांकित, एक्सेल में खोलने के लिए csv का नाम बदलकर), और sql में तालिका परिभाषा रखती है, आपने अनुमान लगाया: एसक्यूएल। इस तरह से आप सब कुछ खोज रहे हैं और जहाँ आपका डेटा है उसे संकीर्ण करना आसान है। यह विधि हालांकि कुछ वातावरण में काम पाने के लिए काफी मुश्किल हो सकती है। स्टैक ओवरफ्लो यहां बहुत मददगार है।
जोएल मेलन

जब आपके पास बड़ा SQL, या शायद संग्रह में है - तो आप इसे सर्वर पर MC सही में खोल सकते हैं, फिर देखें-> खोज
विटाली Zdanevich

1
अच्छा सुझाव! लेकिन, यह काम नहीं करेगा यदि db डंप फ़ाइल वास्तव में बड़ी है (स्थिति जो मैं अब कर रहा हूँ :))
Boban

207

यदि आपके पास phpMyAdmin स्थापित है तो इसकी 'खोज' सुविधा का उपयोग करें।

  • अपना DB चुनें
  • सुनिश्चित करें कि आपके पास एक DB चयनित है (अर्थात तालिका नहीं है, अन्यथा आपको पूरी तरह से अलग खोज संवाद मिलेगा)
  • 'खोज' टैब पर क्लिक करें
  • इच्छित खोज शब्द चुनें
  • खोजने के लिए तालिकाओं का चयन करें

मैंने 250 टेबल / 10 जीबी डेटाबेस (एक फास्ट सर्वर पर) पर इसका उपयोग किया है और प्रतिक्रिया समय आश्चर्यजनक से कम नहीं है।


8
हमारे डेटाबेस में से एक 92.7 जीबी है और यह विकल्प ठीक काम करता है। महान समाधान
मुश्किल

5
मैं हमेशा यह भूल जाता हूं कि सभी phpMyAdmin क्या कर सकते हैं। यह एक महान उपकरण है!
विले

1
अत्यंत तेज, और मेरे Magento के DB में सहायक। उस डेटा के लिए फ़ील्ड मिला जिसे मैं कुछ सेकंड में देख रहा था, और अन्य सभी तालिकाओं को भी संदर्भित कर रहा था।
२०:३० पर mtrueblood

1
MySQL Workbench में यह सुविधा भी है: "डेटाबेस >> सर्च टेबल डेटा ..."
मैट विल्की

1
अच्छा! अब आप phpmyadmin में खोजे गए स्ट्रिंग को कैसे बदलेंगे?
पथरोस

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

यह उन लोगों के लिए है, जो नहीं जानते हैं।
नंदोस्टाइल

$mysqliइस तरह सेट करें:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
एडम टेलर

इसके अलावा, मैं अत्यधिक अनुशंसा करता हूं कि इसके $columसाथ "`$colum`"फ़ील्ड को आरक्षित शब्दों के कारण समस्या नहीं होगी
एडम टेलर

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) एक नई क्वेरी विंडो में परिणाम पेस्ट करें और अपने दिल की सामग्री पर चलाएँ।

विस्तार से: मैं सिस्टम स्कीमा को बाहर करता हूं जो आप आमतौर पर अपने कार्यक्षेत्र में नहीं देख सकते हैं जब तक कि आपके पास विकल्प की Show Metadata and Internal Schemasजांच न हो।

ANALYZEजरूरत पड़ने पर या OPTIMIZEप्रदर्शन सुधारों का समर्थन करने के लिए बयान चलाने के लिए मैंने पूरे HOST या DB को एक त्वरित तरीका प्रदान करने के लिए ऐसा किया ।

मुझे यकीन है कि ऐसा करने के बारे में आपके अलग - अलग तरीके हो सकते हैं, लेकिन यहां मेरे लिए क्या काम करता है:

-- ========================================== 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. आप डीबीए पर गुस्सा करने की कोशिश कर रहे हैं। (आप अपने डेस्क पर लोगों के पास जल्दी के साथ आ सकते हैं ।)

चीयर्स, जय; -]


1
निश्चित रूप से कुछ ऐसा नहीं है जिसे आप लाइव db पर चलाना चाहते हैं लेकिन कुछ डिबगिंग कार्यों के लिए सहायक है। यह तब विफल रहता है जब स्तंभ प्रकार स्ट्रिंग के विरुद्ध तुलना नहीं करता है। यानी एक अंतर स्तंभ।
माइकल थेसल

महान बिंदु, मैंने थ्रू ब्लब्स, चार्ट या इन्टस की खोज के लिए तीन विकल्प जोड़े। यह सिर्फ एक सामान्यीकरण है और इसे हमेशा ही सावधानी के साथ प्रयोग किया जाना चाहिए। जैसा कि आपने उल्लेख किया है कि उत्पादन पर, आमतौर पर वह है जो आपको निकाल दिया जाता है "इंटरनेट पर स्क्रिप्ट खोजना और उन्हें समझना नहीं है, लेकिन अभी भी उन्हें चला रहा है" लेकिन, अरे, यह है कि कैसे लोग कठिन तरीके से सीखते हैं।
JayRizzo

8

मैंने अपने खुद के mysql क्रॉलर को कुछ वर्डप्रेस कॉन्फ़िगरेशन की खोज करने के लिए भी किया था, इंटरफ़ेस और डेटाबेस दोनों में इसे खोजने में असमर्थ था, और डेटाबेस डंप बहुत भारी और अपठनीय थे। मुझे कहना होगा कि मैं अब इसके बिना नहीं कर सकता।

यह @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
मुझे यह त्रुटि मिलती है: घातक त्रुटि: संदेश 'SQLSTATE [42000] के साथ अपवादित' PDOException ': सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1064 आपके SQL सिंटैक्स में कोई त्रुटि है; '' LIKE REPLACE (REPLACE (REPLACE ('180well *'), '\\', '\\\\'), '%' के पास सही सिंटैक्स का उपयोग करने के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैनुअल की जाँच करें। ',' एट लाइन 1 '
LLBBL

6

यह सभी कॉलम और टेबल्स को पुनः प्राप्त करने के लिए सबसे सरल क्वेरी है

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

सभी तालिकाओं या विशिष्ट स्ट्रिंग वाले नाम phpMyAdmin में खोज टैब के माध्यम से खोजे जा सकते हैं।

अच्छा प्रश्न है ... \ ^। ^


20
और मूल्यों के बारे में कैसे?
थीहज

6

MySQL कार्यक्षेत्र का उपयोग करना कई सारणियों का चयन करना और DB के उन सभी तालिकाओं में पाठ की खोज को चलाना आसान है ;-)


धन्यवाद! पहली बार मैंने कार्यक्षेत्र का उपयोग किया है। काफी सहज था, इसने मुझे उस तालिका की ओर इशारा किया जिसकी मुझे आवश्यकता थी और मैं वहां से इसका पता लगाने में सक्षम था।
जोशमिलर

6

यद्यपि यह प्रश्न पुराना है, यहाँ है कि आप इसे कैसे कर सकते हैं यदि आप mysql कार्यक्षेत्र 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) ऑपरेशन के लिए = = क्या आप इसे ठीक कर सकते हैं? धन्यवाद!
दावुज

6

यह सरल तरीका है जो मुझे पता है। PHPMyAdmin में अपने DB का चयन करें, और "खोज" टैब पर जाएं और लिखें कि आप क्या खोजना चाहते हैं और आप कहां खोज रहे हैं। सभी तालिकाओं का चयन करें यदि आप सभी तालिकाओं से शब्द खोजेंगे। फिर "जाओ" और परिणाम देखें।मैं शब्द हटाने के लिए मेरे वर्डप्रेस DB से VCD (पिछले दरवाजे) शब्द खोजना चाहता हूं


5

मैं उपयोग कर रहा हूँ HeidiSQL लोकप्रिय MySQL सर्वर का उपयोग करके वेब डेवलपर्स के लिए डिज़ाइन किया गया एक उपयोगी और विश्वसनीय उपकरण है।

HeidiSQL में आप Shift + ctrl + f पुश कर सकते हैं और आप सभी टेबलों में सर्वर पर टेक्स्ट पा सकते हैं। यह विकल्प बहुत उपयोगी है।


+1 काम को अच्छी तरह से करने के लिए लगता है और एक उपयोगी उपकरण है जो कुछ अन्य उत्तरों में शामिल फाफ को बचाता है। यह भी ध्यान देने योग्य है कि यह आपको कौन सा डेटाबेस चुनने के लिए अनुमति देता है।
स्टीव चेम्बर्स

3

आप उपयोग कर सकते हैं

SHOW TABLES;

फिर उन तालिकाओं (एक लूप में) के साथ कॉलम प्राप्त करें

SHOW COLUMNS FROM table;

और फिर उस जानकारी के साथ कई सवाल पैदा करते हैं जिन्हें आप ज़रूरत पड़ने पर यूनिअन भी कर सकते हैं।

लेकिन यह डेटाबेस पर बहुत भारी है। विशेष रूप से अगर आप LIKE सर्च कर रहे हैं।


SHOW TABLES FROM <db_name>अधिक सटीक है
vladkras

3

यह समाधान
a) केवल 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 में आपकी क्वेरी चला रहा हूं, तो मुझे त्रुटि हो रही है
विक्की देव

@VickyDev मुझे पता है कि यह आपके प्रश्न के बाद से एक वर्ष से अधिक हो गया है। माफ़ करना। फिर भी: मुझे लगता है कि आपकी स्क्रिप्ट में कुछ और गलत है क्योंकि stmt को EXECUTE से ऊपर की पंक्ति में घोषित किया गया है। MySQL के कौन से संस्करण का आप उपयोग कर रहे हैं?
चोनज

2

मैंने ओलिवियर के PHP उत्तर को थोड़ा संशोधित किया:

  • उन परिणामों को प्रिंट करें जिनमें स्ट्रिंग पाई गई थी
  • परिणाम के बिना तालिकाओं को छोड़ दें
  • यदि स्तंभ नाम खोज इनपुट से मेल खाते हैं तो भी आउटपुट दिखाएं
  • कुल परिणाम देखें

    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')इसे बेहतर बना सकते हैं, इसे निष्पादित कर सकते हैं, इसका उपयोग कर सकते हैं, उपयोग किए गए स्कीमा की जांच कर सकते हैं, और उपयोग किए गए स्कीमा को उस स्थान पर सेट कर सकते हैं, जहां से अन्य सभी को छोड़कर।
ब्रैडबरी 9

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

मैंने क्वेरीज़ को एक साथ जोड़ने के लिए यूनियन का उपयोग किया। नहीं पता कि यह सबसे कुशल तरीका है, लेकिन यह काम करता है।

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

इस उत्तर के साथ समस्या यह है कि एक चर और
अनकाउंट

0

सभी तालिकाओं, रीडोना को पढ़ने के लिए एक अच्छा पुस्तकालय है

$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 । यह एक खोज बॉक्स खोलता है जहाँ आप खोज स्ट्रिंग और हिट खोज में भरते हैं।

आपको उस तालिका का चयन करने की आवश्यकता है जिसे आप बाएं फलक पर खोजना चाहते हैं। लेकिन अगर आप शिफ्ट को दबाए रखते हैं और एक समय में 10 तालिकाओं की तरह चुनते हैं, तो MySql इसे संभाल सकता है और परिणाम सेकंड में वापस कर सकता है।

बेहतर विकल्पों की तलाश में किसी के लिए! :)


क्या आप इस सब में आवेदन कर रहे हैं?
जॉन श्नाइडर

वह नेविगेटर एप्लिकेशन का उपयोग कर रहा है।
दामिर ओलेजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.