MySQL veritabanının her tablosundaki tüm alanlarda arama yapın


299

Muhtemelen sözdizimi kullanarak, bir MySQL veritabanının tüm tablolarından belirli bir dize tüm alanlarda aramak istiyorum:

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

Böyle bir şey yapmak mümkün mü?


2

Yanıtlar:


81

Şemaya göz atabilirsiniz information_schema. Tüm tabloların ve tablodaki tüm alanların bir listesine sahiptir. Daha sonra bu tablodan aldığınız bilgileri kullanarak sorgu çalıştırabilirsiniz.

İlgili tablolar SCHEMATA, TABLOLAR ve COLUMNS'dir. Tabloların bir şemada nasıl oluşturulduğunu tam olarak oluşturabileceğiniz yabancı anahtarlar vardır.


49
bu istediğim cevap değil, ama gerçeği kabul etmeliyim. : D Teşekkür ederim
RSilva

1
Bu doğru, ama @Dan Rather'ın yanıtı da yardımcı oldu, çünkü baktığım db belirsiz bir şekilde ayarlandı ve sadece bakarak sadece sütun adı veya tablonun ne olacağını
anlayamadım

12
information_schemabir veritabanı değil, bir veritabanıdır. Hangi tabloyu arayacağınıza dair bazı açıklamalar information_schemaiyi olur!
CaptSaltyJack

3
MySql'in tüm tabloları aramanın hiçbir yolu olmadığını bana komik buluyorum. Oldukça basit bir seçenek gibi görünüyor
Kolob Kanyonu

@KolobCanyon MySQL bunu db_name LIKE '
pattern'den

443

Bir SQLDumpveritabanını (ve verilerini) yapabilir ve o dosyada arama yapabilirsiniz.


20
Çıktıyı daha okunabilir hale getirmek için mysqldump için --extended-insert = FALSE bayrağı kullanabileceğinizi unutmayın.
Benubird

26
Merak ediyorsanız, benim gibi, kalem yorumunun ne hakkında olduğunu: snopes.com/business/genius/spacepen.asp
Jason Swett

2
Bu, tüm DB'leri aramanın "standart" (fiili) yoludur. mysqldump -TBelirli bir dizinde tablo başına iki dosya oluşturur gibi . Sonra grep <search> *dir ve ben döndürülen tablename.txt veya .sql dosyası. Txt dosyası, tablo için verileri tutar (sekmeyle ayrılmış, Excel'de açmak için csv olarak yeniden adlandır) ve sql, tablo tanımını tutar, tahmin ettiniz: SQL. Bu şekilde her şeyi ararsınız ve verilerinizin nerede olduğunu daraltmak kolaydır. Yine de bu yöntemin belirli ortamlarda çalışması oldukça zor olabilir. Yığın Taşması burada çok yardımcı olur.
Joel Mellon

Büyük
SQL'iniz

1
Güzel öneri! Ancak, db dökümü dosyası gerçekten büyükse (şimdi sahip olduğum durum :))
Boban

207

Eğer phpMyAdmin kurulu ise 'Ara' özelliğini kullanın.

  • DB'nizi seçin
  • Seçili bir DB seçtiğinizden emin olun (yani tablo değil, aksi takdirde tamamen farklı bir arama iletişim kutusu alırsınız)
  • 'Ara' sekmesini tıklayın
  • İstediğiniz arama terimini seçin
  • Aranacak tabloları seçin

Ben 250 tablo / 10GB veritabanlarında (hızlı bir sunucuda) kullandım ve tepki süresi şaşırtıcı kısa bir şey değil.


8
Veritabanlarımızdan biri 92.7Gb ve bu seçenek gayet iyi çalıştı. Büyük bir çözüm
Tricky

5
Her zaman tüm phpMyAdmin neler yapabileceğini unutuyorum. Harika bir araç!
Ville

1
Son derece hızlı ve benim Magento db yararlı. Aradığım veriyi birkaç saniye içinde buldum ve ayrıca referans veren diğer tüm tabloları da buldum.
mtrueblood

1
MySQL Workbench de bu özelliğe sahiptir: "Veritabanı >> Arama Tablo Verileri ..."
matt wilkie

1
Güzel! Şimdi phpmyadmin'de aranan dizeyi nasıl değiştirirdiniz?
Pathros

46

PHP işlevi:

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

Bu pho, bilmeyenler için.
Nandostyle

Şunun $mysqligibi ayarla :$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
Adam Taylor

Ayrıca, ben çok yerine tavsiye $columile "`$colum`"böylece ayrılmış kelimelerdir alanlar olmaz sorunlara neden
Adam Taylor


12

stored proceduresVeba gibi bir şeyden kaçınıyorsanız veya mysql_dumpizinlerden dolayı bir şey yapamıyorsanız veya başka çeşitli nedenlerle karşılaşamıyorsanız.

Bunun gibi üç adımlı bir yaklaşım öneririm:

1) Bu sorgunun, sonuç kümesi olarak bir grup sorgu oluşturduğu yer.

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

Sonuçlar şöyle görünmelidir:

Bu sonuçları başka bir sorgu penceresine kopyala

2) Sonra sadece Right Clickve kullanabilirsinizCopy Row (tab-separated)

resim açıklamasını buraya girin

3) Sonuçları yeni bir sorgu penceresine yapıştırın ve kalbinizin içeriğine çalıştırın.

Detay: Seçeneği Show Metadata and Internal Schemasişaretlemediğiniz sürece genellikle çalışma tezgahınızda göremeyeceğiniz sistem şemalarını hariç tutarım .

ANALYZEGerektiğinde veya çalıştırmak için tüm HOST veya DB hızlı bir yol sağlamak için yaptımOPTIMIZE performans geliştirmelerini desteklemek deyimleri .

Eminim bunu yapmak için farklı yollar vardır ama benim için işe yarayan:

-- ========================================== 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 Sürümünde Test Edildi: 5.6.23

UYARI: EĞER BU DURUMDA ÇALIŞTIRMAYIN:

  1. Tablo kilitlerine neden olmaktan endişe duyuyorsunuz (istemci bağlantılarınıza dikkat edin)
  2. Ne yaptığınızdan emin değilsiniz.

  3. DBA'yı kızdırmaya çalışıyorsun. ( hızlıca masanızda insanlar olabilir .)

Şerefe Jay; -]


1
Kesinlikle bir şey canlı bir db üzerinde çalıştırmak istediğiniz ama bazı hata ayıklama görevleri için yararlı değil. Sütun türü bir dizeyle karşılaştırılamazsa bu başarısız olur. Yani bir int sütunu.
Michael Thessel

Büyük bir nokta, lekeler, karakterler veya ints aramak için üç alternatif ekledim. Bu sadece bir Genelleştirmedir ve DAİMA DİKKAT ile kullanılmalıdır. ÜRETİMDE HİÇBİR Dediğiniz gibi, genellikle işten kovulmuş "İnternette komut dosyaları bulmak ve onları anlamak değil, ama yine de onları çalıştırmak" işte budur ama hey, insanların zor yolu bu şekilde öğrenir.
JayRizzo

8

Ayrıca bazı wordpress yapılandırmasını aramak için kendi mysql paletli yaptım, hem arayüzde hem de veritabanında bulamadı ve veritabanı dökümleri çok ağır ve okunaksızdı. Şimdi onsuz yapamayacağımı söylemeliyim.

@Olivier'deki gibi çalışır, ancak egzotik veritabanı / tablo adlarını yönetir ve LIKE-joker güvenlidir.

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

Bu komut dosyasını çalıştırmak şöyle bir çıktı verebilir:

---------------------------------------------------
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
Bu hatayı alıyorum: Önemli hata: 'SQLSTATE [42000] iletisiyle yakalanmamış özel durum' PDOException ': Sözdizimi hatası veya erişim ihlali: 1064 SQL sözdiziminizde bir hata var; 'anahtar LIKE REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE) (REPLACE (REPLACE (DEĞİŞTİR) (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE)) (REPLACE (REPLACE (REPLACE (REPLACE) (REPLACE (REPLACE (REPLACE (REPLACE)) ',' satır 1'de '
LLBBL

6

Bu, tüm Sütunları ve Tabloları yeniden elde etmek için en basit sorgu

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

Tüm tablolar veya adında belirli bir dize olan tablolar phpMyAdmin'deki Arama sekmesi aracılığıyla aranabilir.

Güzel Sorunuz Var ... \ ^. ^ /


20
Peki ya değerler?
themhz

6

MySQL Workbench kullanarak birkaç tablo seçmek ve DB ;-) 'nin tüm bu tablolarında metin araması yapmak kolaydır


Teşekkür ederim! İlk kez tezgah kullandım. Oldukça sezgisel, bana gereken tabloya işaret etti ve oradan bulmak mümkün.
joshmiller

6

Bu soru eski olmasına rağmen, mysql çalışma tezgahı 6.3 kullanıyorsanız bunu nasıl yapabileceğiniz aşağıda açıklanmıştır. (Büyük olasılıkla diğer sürümler için de çalışır)

Şemanızı sağ tıklayın ve "Tablo verilerini arayın", değerinizi girin ve "Aramayı Başlat" düğmesine basın. Bu kadar.


6

İşte bunun için benim çözümüm

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
çalıştırdığımda CALL findAll('tbl_test','abb'), bu hatayı kaçırdım: # 1267 - İşlemler için geçersiz harmanlama karışımı (utf8_general_ci, IMPLICIT) ve (utf8_unicode_ci, IMPLICIT) '=' Düzeltebilir misiniz? Teşekkürler!
Davuz

6

Bildiğim basit bir yol bu. PHPMyAdmin'de DB'nizi seçin ve "Ara" sekmesine gidin ve ne bulmak istediğinizi ve nerede arayacağınızı yazın. Tüm tablolardaki kelimeleri arayacaksanız tüm tabloları seçin. Sonra "GİT" ve sonuca bakın.Silmek için Wordpress DB'den VCD (arka kapı) kelimesini bulmak istiyorum


5

HeidiSQL kullanıyorum, popüler MySQL sunucusunu kullanan web geliştiricileri için tasarlanmış kullanışlı ve güvenilir bir araçtır.

HeidiSQL'de shift + ctrl + f tuşlarına basabilir ve sunucudaki metni tüm tablolarda bulabilirsiniz. Bu seçenek çok kullanışlı.


+1 İşi iyi yapıyor gibi görünüyor ve diğer bazı cevaplarda yer alan faff'ı koruyan kullanışlı bir araçtır. Ayrıca, hangi veritabanlarında arama yapacağınızı seçmenize izin verdiğini belirtmek gerekir.
Steve Chambers

3

Kullanabilirsin

SHOW TABLES;

Ardından, bu tablolardaki sütunları (döngü halinde)

SHOW COLUMNS FROM table;

ve daha sonra bu bilgilerle İhtiyacınız olursa UNION yapabileceğiniz birçok sorgu oluşturun.

Ama bu veritabanında son derece ağır. Özellikle GİBİ arama yapıyorsanız.


SHOW TABLES FROM <db_name>daha kesin
vladkras

3

Bu çözüm
a) yalnızca MySQL'dir, başka bir dile gerek yoktur ve
b) işleme alınmaya hazır SQL sonuçlarını döndürür!

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

Bu tür bir çözüm için genellikle onları phpfiddler'a eklemek hoş olur, böylece insanlar çözümünüze bir göz atabilir ve hatta yorum yapabilir. :)
pal4life

#1243 - Unknown prepared statement handler (stmt) given to EXECUTETüm veritabanında arama için Phpmyadmin sorgunuzu çalıştırdığınızda hata alıyorum
Vicky Dev

@VickyDev Sorunuzun üzerinden bir yıldan fazla zaman geçtiğini biliyorum. Afedersiniz. Yine de stmt EXECUTE üstündeki satırda bildirildiğinden betiğinizde başka bir şeylerin yanlış olduğunu düşünüyorum. Hangi MySQL sürümünü kullanıyorsunuz?
Chonez

2

Olivier PHP cevabını biraz değiştirdim:

  • dizenin bulunduğu sonuçları yazdırın
  • sonuçsuz tabloları çıkar
  • sütun adları arama girişiyle eşleşiyorsa çıktıyı da göster
  • toplam sonuç sayısını göster

    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

Önceki bir cevaba dayanarak bunu yaptım, sadece tüm çıktılara rahatça katılabilmek için bazı ekstra dolgu var:

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

Önce bunu çalıştırın, sonra yapıştırın ve sonucu çalıştırın (düzenleme yok) ve değerin kullanıldığı tüm tablo adlarını ve sütunlarını görüntüler.


1
Bir sütun değeri üzerinde yapılan dört kontrol en basit yöntem değildir. Bunu yapabilir / WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')daha da iyisi yapabilir, yürütebilir, kullanılan şemaları kontrol edebilir ve kullanılan şemayı bunun yerine diğerlerini hariç tutabilirsiniz.
bradbury9

1

Bunu işe aldım. sadece değişkenleri değiştirmeniz gerekir

$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

Ben HeidiSQL kullanarak yaptım. Bulmak kolay değil ama Ctrl + Shift + F tuşlarına basarak "tablo araçları" iletişim kutusunu görüntüler. Daha sonra ne aramak istediğinizi seçin (Tek tablodan tam veritabanı) ve "Bulmak için metin" değerini girin ve "Bul" u tıklayın. Şaşırtıcı derecede hızlı buldum (bir dakikadan daha kısa sürede 870MiB db)


0

Sendikaları sorguları birleştirmek için kullandım. En etkili yol olup olmadığını bilmiyorum, ama işe yarıyor.

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

Bu cevapla ilgili sorun değişken ve bilinmeyen bir tablo sayısı olmasıdır
bradbury9

0

Tüm tabloları okumak için güzel bir kütüphane var, 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

Bunun sadece son sürümlerde olup olmadığını bilmiyorum, ancak bölmedeki Tablesseçeneğe sağ tıklandığında Navigatoradlandırılan bir seçenek açılır Search Table Data. Bu, arama dizesini doldurup aramaya bastığınız bir arama kutusu açar.

Sol bölmede aramak istediğiniz tabloyu seçmeniz gerekir. Ancak shift tuşunu basılı tutarsanız ve aynı anda 10 tablo seçerseniz, MySql bunu halledebilir ve saniyeler içinde sonuç döndürebilir.

Daha iyi seçenekler arayan herkes için! :)


Tüm bunları hangi uygulamada yapıyorsunuz?
Jon Schneider

Navigator uygulamasını kullanıyor.
Damir Olejar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.