মাইএসকিউএল ডাটাবেসের প্রতিটি টেবিল থেকে সমস্ত ক্ষেত্রে অনুসন্ধান করুন


298

আমি একটি মাইএসকিউএল ডাটাবেসের সমস্ত টেবিল থেকে একটি প্রদত্ত স্ট্রিংয়ের সমস্ত ক্ষেত্রগুলিতে সন্ধান করতে চাই, সম্ভবত সিনট্যাক্স হিসাবে এটি ব্যবহার করব:

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

এরকম কিছু করা কি সম্ভব?


2
এই ব্লগটি সহায়ক হতে পারে: winashwin.wordpress.com/2012/08/28/mysql-search

উত্তর:


81

আপনি information_schemaস্কিমাতে উঁকি দিতে পারেন । এটিতে সারণীতে থাকা সমস্ত সারণী এবং সমস্ত ক্ষেত্রের একটি তালিকা রয়েছে। তারপরে আপনি এই টেবিলটি থেকে যে তথ্য পেয়েছেন তা ব্যবহার করে আপনি ক্যোয়ারী চালাতে পারেন।

জড়িত সারণীগুলি হ'ল স্কেমটা, ট্যাবলেট এবং কলম্বস। বিদেশী কী রয়েছে যেমন আপনি স্কিমায় টেবিলগুলি কীভাবে তৈরি করা হয় ঠিক তা বানাতে পারেন।


49
এটি আমি যে উত্তর চেয়েছিলাম তা নয়, তবে আমাকে সত্যটি গ্রহণ করতে হবে। : ডি আপনাকে ধন্যবাদ
আরসিলভা

1
এটি সঠিক, তবে @ ড্যান রায়েরের উত্তরটিও খুব সাহায্য করেছিল, কারণ আমি যে ডিবিটি দেখছিলাম তা অস্পষ্টভাবে সেটআপ করা হয়েছিল এবং কলামের নাম বা টেবিলটি কী তা নিশ্চিতভাবে দেখাবে তা নিশ্চিত করেই বুঝতে
পারছিলাম না

12
information_schemaএকটি ডাটাবেস, একটি টেবিল নয়। কোন টেবিলের মধ্যে information_schemaকিছু অনুসন্ধান করা উচিত তা ভাল হবে!
ক্যাপ্টসাল্টিজ্যাক 21

3
এটি আমার জন্য একধরনের হাসিখুশি বিষয় যে মাই এসকিএল সমস্ত টেবিল অনুসন্ধানের কোনও উপায় সরবরাহ করে নি। একটি চমত্কার প্রাথমিক বিকল্প হিসাবে মনে হচ্ছে
কলব ক্যানিয়ন


442

আপনি SQLDumpডাটাবেসের একটি (এবং এর ডেটা) করতে পারেন তারপরে সেই ফাইলটি সন্ধান করুন।


20
ভুলে যাবেন না যে আপনি আউটপুটটিকে আরও পঠনযোগ্য করে তুলতে মাইএসকিএলডাম্পের জন্য - এক্সটেন্ডেড-সন্নিবেশ = ফলস পতাকা ব্যবহার করতে পারেন।
বেনুবার্ড

26
আপনি যদি ভাবছেন যে, আমি যেমন ছিলাম তখন পেন্সিলের মন্তব্যটি কী: স্নোপস
জেসন সোয়েট

2
পুরো ডিবিগুলি অনুসন্ধান করার জন্য এটি "স্ট্যান্ডার্ড" (ডি ফ্যাক্টো) উপায়। আমি পছন্দ করি mysqldump -Tযা একটি নির্দিষ্ট ডিরেক্টরিতে টেবিলের জন্য দুটি ফাইল তৈরি করে। আমি তখন grep <search> *দির, এবং যা ফিরে এসেছে তা হ'ল টেবিলের নাম.টিএসটিএসটি বা। এসকিএল ফাইল। Txt ফাইলটি টেবিলের জন্য ডেটা ধারণ করে (ট্যাবে সীমিত, এক্সেলের মধ্যে খোলার জন্য সিএসভির পুনরায় নামকরণ), এবং এসকিউএল এতে টেবিলের সংজ্ঞা ধারণ করে, আপনি এটি অনুমান করেছেন: এসকিউএল। এইভাবে আপনি সমস্ত কিছু অনুসন্ধান করছেন এবং আপনার ডেটা কোথায় রয়েছে তা সংকীর্ণ করা সহজ। যদিও এই পদ্ধতিটি নির্দিষ্ট পরিবেশে কাজ করা বেশ কঠিন হতে পারে। স্ট্যাক ওভারফ্লো এখানে খুব সহায়ক।
জোয়েল মেলন

যখন আপনার কাছে বড় এসকিউএল রয়েছে, বা সম্ভবত সংরক্ষণাগারটিতে রয়েছে - আপনি এটিকে সরাসরি সার্ভারের
এমসিতে

1
ভাল পরামর্শ! তবে, ডিবি ডাম্প ফাইলটি যদি সত্যিই বড় হয় তবে এটি কাজ করবে না (পরিস্থিতিটি আমার এখনই ঘটছে :))
বোবান

207

আপনি যদি পিএইচপিএমওয়াই অ্যাডমিন ইনস্টল করেন তবে এর 'অনুসন্ধান' বৈশিষ্ট্যটি ব্যবহার করুন।

  • আপনার ডিবি নির্বাচন করুন
  • নিশ্চিত হয়ে নিন যে আপনার একটি ডিবি নির্বাচিত হয়েছে (যেমন কোনও টেবিল নয়, অন্যথায় আপনি সম্পূর্ণ আলাদা অনুসন্ধান ডায়ালগ পাবেন)
  • 'অনুসন্ধান' ট্যাবে ক্লিক করুন
  • আপনি চান অনুসন্ধান শব্দটি চয়ন করুন
  • সারণী সারণী চয়ন করুন

আমি এটি 250 টেবিল / 10 জিবি ডাটাবেসগুলিতে (একটি দ্রুত সার্ভারে) ব্যবহার করেছি এবং প্রতিক্রিয়া সময়টি আশ্চর্যর চেয়ে কম কিছু নয়।


8
আমাদের ডাটাবেসের মধ্যে একটি 92.7Gb এবং এই বিকল্পটি ঠিক কাজ করেছে। দুর্দান্ত সমাধান
কৌশলটি

5
আমি সবসময় ভুলে যাই সমস্ত পিএইচপিএমআইএইডমিন কি করতে পারে। এটি একটি দুর্দান্ত সরঞ্জাম!
ভিল

1
চূড়ান্তভাবে দ্রুত এবং আমার ম্যাজেন্টো ডিবিতে সহায়ক। আমি কয়েক সেকেন্ডের মধ্যে যে ডেটাটির সন্ধান করছিলাম তার ক্ষেত্রটি এবং অন্যান্য উল্লেখযোগ্য টেবিলগুলিও এটি খুঁজে পেয়েছিল।
মিট্রুব্লুড

1
মাইএসকিউএল ওয়ার্কবেঞ্চের এই বৈশিষ্ট্যটিও রয়েছে: "ডেটাবেস >> সারণী ডেটা অনুসন্ধান করুন ..."
ম্যাট উইলকি

1
নিস! এখন আপনি phpmyadmin- এ অনুসন্ধান করা স্ট্রিংটি কীভাবে প্রতিস্থাপন করবেন?
প্যাথ্রোজ

46

পিএইচপি ফাংশন:

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`"যাতে ক্ষেত্র সংরক্ষিত শব্দ সমস্যা সৃষ্টি করবে না
আদম টেলর


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

মাইএসকিউএল সংস্করণে পরীক্ষিত: 5.6.23

সতর্কতা: এটি চালাবেন না যদি:

  1. আপনি টেবিল-লক তৈরির সাথে উদ্বিগ্ন (আপনার ক্লায়েন্ট-সংযোগগুলিতে নজর রাখুন)
  2. আপনি কী করছেন সে সম্পর্কে আপনি অনিশ্চিত।

  3. আপনি ডিবিএকে রাগ করার চেষ্টা করছেন। ( দ্রুততার সাথে আপনার ডেস্কে লোক থাকতে পারে ))

চিয়ার্স, জে; -]


1
অবশ্যই আপনি লাইভ ডিবিতে চালাতে চান এমন কিছু নয় তবে নির্দিষ্ট ডিবাগিং কার্যগুলির জন্য সহায়ক। কলামের ধরণ যদি স্ট্রিংয়ের সাথে তুলনা না করে তবে এটি ব্যর্থ হয়। ইন্টি ইন কলাম।
মাইকেল থেসেল

দুর্দান্ত বিষয়, আমি ব্লবগুলি, অক্ষর বা ইনটগুলি অনুসন্ধান করার জন্য তিনটি বিকল্প যুক্ত করেছি। এটি কেবল একটি সাধারণীকরণ এবং সর্বদা সতর্কতার সাথে ব্যবহার করা উচিত। উত্পাদনের বিষয়ে কখনও যেমন আপনি উল্লেখ করেছেন, সাধারণত এটিই আপনাকে "ইন্টারনেটে স্ক্রিপ্টগুলি সন্ধান করতে এবং সেগুলি বুঝতে না পারার পরেও চালিয়ে যায়" তবে, আরে মানুষ এইভাবে কীভাবে শিখবে।
জয়রিজ্জো

8

আমি কিছু ওয়ার্ডপ্রেস কনফিগারেশন অনুসন্ধান করার জন্য আমার নিজের মাইএসকিএল ক্রলারটিও করেছি, এটি ইন্টারফেস এবং ডাটাবেস উভয় ক্ষেত্রেই খুঁজে পেতে অক্ষম ছিল এবং ডাটাবেস ডাম্পগুলি খুব ভারী এবং অপঠনযোগ্য ছিল। আমি অবশ্যই বলব আমি এখন এটি ছাড়া করতে পারি না।

এটি @ অলিভিয়ারের মতো কাজ করে তবে এটি বহিরাগত ডাটাবেস / সারণীর নাম পরিচালনা করে এবং লাইক-জোকার নিরাপদ safe

<?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
আমি এই ত্রুটিটি পেয়েছি: মারাত্মক ত্রুটি: এসকিউএলস্টেট [42000] বার্তা সহ 'PDOException' ব্যতীত ব্যতিক্রম: সিনট্যাক্স ত্রুটি বা অ্যাক্সেস লঙ্ঘন: 1064 আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; 'মাই লাইক রিপ্লেস (রিপ্লেস (রিপ্লেস (রিপ্লেস (রিপ্লেস (' 180 ওয়েল * ',' \\ ',' \\\\ ')),'% ব্যবহার করার জন্য ডান সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন% ',' লাইন 1 এ '
LLBBL

6

সমস্ত কলাম এবং টেবিল পুনরুদ্ধার করার জন্য এটি সহজতম ক্যোয়ারী

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

নামযুক্ত নির্দিষ্ট স্ট্রিংযুক্ত সমস্ত টেবিল পিএইচপিএমআইএডমিনে অনুসন্ধান ট্যাবের মাধ্যমে অনুসন্ধান করা যেতে পারে।

সুন্দর জিজ্ঞাসা করুন ... \ ^। ^ /


20
এবং কিভাবে মূল্যবোধ সম্পর্কে?
themhz

6

মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করে বেশ কয়েকটি টেবিল নির্বাচন করা সহজ এবং ডিবি এর সমস্ত টেবিলের পাঠ্যের জন্য অনুসন্ধান চালানো সহজ ;-)


ধন্যবাদ! প্রথমবার আমি ওয়ার্কবেঞ্চ ব্যবহার করেছি। মোটামুটি স্বজ্ঞাত, এটি আমার প্রয়োজনীয় টেবিলটির দিকে আমাকে ইঙ্গিত করেছিল এবং আমি সেখান থেকে এটি সনাক্ত করতে সক্ষম হয়েছি।
জোশ্মিলার

6

যদিও এই প্রশ্নটি পুরানো, আপনি এখানে কীভাবে করতে পারেন যদি আপনি মাইএসকিএল ওয়ার্কবেঞ্চ 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

এটি আমার জানা সহজ উপায়। পিএইচপিএমআইএডমিনে আপনার ডিবি নির্বাচন করুন এবং "অনুসন্ধান" ট্যাবে যান এবং আপনি কী সন্ধান করতে চান এবং কোথায় আপনি অনুসন্ধান করবেন তা লিখুন। আপনি যদি সমস্ত টেবিল থেকে শব্দগুলি সন্ধান করেন তবে সমস্ত সারণী নির্বাচন করুন। তারপরে "যান" এবং ফলাফলটি দেখুন।মোছার জন্য আমি আমার ওয়ার্ডপ্রেস ডিবি থেকে ভিসিডি (ব্যাকডোর) শব্দটি খুঁজতে চাই


5

আমি হেইডিএসকিউএল ব্যবহার করছি জনপ্রিয় মাইএসকিউএল সার্ভার ব্যবহার করে ওয়েব বিকাশকারীদের জন্য ডিজাইন করা একটি দরকারী এবং নির্ভরযোগ্য সরঞ্জাম tool

হেইডিএসকিউএলে আপনি শিফট + সিটিআরএল + এফ চাপতে পারেন এবং আপনি সমস্ত সারণীতে সার্ভারে টেক্সট পেতে পারেন। এই বিকল্পটি খুব কার্যকরভাবে।


+1 কাজটি ভালভাবে করাতে দেখে মনে হচ্ছে এবং এটি একটি দরকারী সরঞ্জাম যা অন্যান্য উত্তরগুলির সাথে জড়িত ফ্যাফকে সংরক্ষণ করে। এটি লক্ষণীয় যে এটি আপনাকে কোন ডেটাবেস (গুলি) সন্ধান করতে হবে তা চয়ন করতে দেয়
স্টিভ চেম্বার্স

3

আপনি ব্যবহার করতে পারেন

SHOW TABLES;

তারপরে সেই টেবিলগুলিতে (একটি লুপে) কলামগুলি পান

SHOW COLUMNS FROM table;

এবং তারপরে সেই তথ্যের সাহায্যে অনেকগুলি ক্যোয়ারী তৈরি করুন যা আপনার প্রয়োজনে আপনি ইউনিয়নও করতে পারেন।

এটি ডাটাবেসে অত্যন্ত ভারী। বিশেষত যদি আপনি একটি পছন্দ অনুসন্ধান করেন।


SHOW TABLES FROM <db_name>আরও সুনির্দিষ্ট
vladkras

3

এই সমাধান
ক) কেবলমাত্র মাইএসকিউএল, অন্য কোনও ভাষার প্রয়োজন নেই, এবং
খ) এসকিউএল ফলাফলগুলি প্রদান করে, প্রক্রিয়াকরণের জন্য প্রস্তুত!

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

এই ধরণের সমাধানের জন্য সাধারণত তাদের পিএইচপিফিডলারে যুক্ত করা ভাল হবে যাতে ভাবেন আপনার সমাধান সম্পর্কে মন্তব্য করতে এবং এমনকি মন্তব্য করতে পারে। :)
pal4Live

আমি #1243 - Unknown prepared statement handler (stmt) given to EXECUTEপুরো ডাটাবেসে অনুসন্ধানের জন্য Phpmyadmin- এ আপনার ক্যোয়ারী চালাতে গিয়ে আমি ত্রুটি পাচ্ছি
ভিকি দেব

@ ভিকিডেভ আমি জানি আপনার প্রশ্নের এক বছরেরও বেশি সময় কেটে গেছে। দুঃখিত। তা সত্ত্বেও: আমি মনে করি আপনার স্ক্রিপ্টে অন্য কিছু ভুল হয়েছে যেহেতু এক্সমিউটের উপরের সারিতে স্ট্যাম্ট ঘোষণা করা হয়েছে। আপনি মাইএসকিউএল এর কোন সংস্করণ ব্যবহার করছেন?
চোনজ

2

আমি অলিভিয়ের পিএইচপি উত্তরটি কিছুটা সংশোধন করেছি:

  • স্ট্রিংটি পাওয়া গিয়েছিল এমন ফলাফলগুলি মুদ্রণ করুন
  • ফলাফল ছাড়াই সারণী বাদ দিন
  • কলামের নামগুলি অনুসন্ধানের ইনপুটটির সাথে মিলে গেলে আউটপুটও দেখায়
  • ফলাফলের মোট সংখ্যা দেখান

    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

আমি এই কাজ পেয়েছিলাম। আপনার কেবল পরিবর্তনশীল পরিবর্তন করতে হবে to

$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

আমি হেইডিএসকিউএল ব্যবহার করে এটি করেছি। এটি সন্ধান করা সহজ নয় তবে Ctrl + Shift + F টিপে এটি "সারণী সরঞ্জাম" সংলাপটি প্রদর্শন করে। তারপরে আপনি যা অনুসন্ধান করতে চান তা নির্বাচন করুন (একক টেবিলের সম্পূর্ণ ডাটাবেস) এবং "সন্ধানের জন্য পাঠ্য" মানটি প্রবেশ করুন এবং "সন্ধান করুন" এ ক্লিক করুন। আমি এটি আশ্চর্যজনকভাবে দ্রুত পেয়েছি (এক মিনিটেরও কম সময়ে 870MiB ডিবি)


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 টি টেবিলের মতো নির্বাচন করেন, মাইএসকিউএল এটি পরিচালনা করতে পারে এবং সেকেন্ডে ফলাফলগুলি ফিরিয়ে আনতে পারে।

যে কেউ আরও ভাল বিকল্প খুঁজছেন জন্য! :)


আপনি কি এই অ্যাপ্লিকেশন এ সব করছেন?
জন স্নাইডার

তিনি ন্যাভিগেটর অ্যাপ্লিকেশনটি ব্যবহার করছেন।
দামির ওলেজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.