Saya ingin mencari di semua bidang dari semua tabel dari database MySQL string yang diberikan, mungkin menggunakan sintaks sebagai:
SELECT * FROM * WHERE * LIKE '%stuff%'
Apakah mungkin melakukan hal seperti ini?
Saya ingin mencari di semua bidang dari semua tabel dari database MySQL string yang diberikan, mungkin menggunakan sintaks sebagai:
SELECT * FROM * WHERE * LIKE '%stuff%'
Apakah mungkin melakukan hal seperti ini?
Jawaban:
Anda dapat mengintip ke dalam information_schema
skema. Ini memiliki daftar semua tabel dan semua bidang yang ada dalam tabel. Anda kemudian dapat menjalankan kueri menggunakan informasi yang Anda dapatkan dari tabel ini.
Tabel yang terlibat adalah SCHEMATA, TABLES, dan COLUMNS. Ada kunci asing sedemikian rupa sehingga Anda dapat membangun dengan tepat bagaimana tabel dibuat dalam suatu skema.
information_schema
adalah database, bukan tabel. Beberapa klarifikasi pada tabel mana untuk mencari di dalam information_schema
akan baik!
Anda dapat melakukan salah SQLDump
satu dari database (dan datanya) kemudian mencari file itu.
mysqldump -T
yang membuat dua file per tabel dalam direktori yang ditentukan. Saya kemudian grep <search> *
di dir, dan apa yang dikembalikan adalah file tablename.txt atau .sql. File txt menyimpan data untuk tabel (tab dibatasi, ganti nama menjadi csv untuk dibuka di Excel), dan sql menampung definisi tabel, Anda dapat menebaknya: SQL. Dengan cara ini Anda mencari semuanya dan mudah untuk mempersempit lokasi data Anda. Metode ini bisa sangat sulit untuk bekerja di lingkungan tertentu. Stack Overflow sangat membantu di sini.
Jika Anda menginstal phpMyAdmin, gunakan fitur 'Cari'.
Saya telah menggunakan ini pada hingga 250 tabel / 10GB basis data (pada server yang cepat) dan waktu responsnya sangat luar biasa.
Fungsi 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
seperti ini:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
$colum
dengan "`$colum`"
sehingga bidang yang disediakan kata-kata tidak akan menimbulkan masalah
Anda dapat menggunakan proyek ini: http://code.google.com/p/anywhereindb
Ini akan mencari semua data di semua tabel.
Jika Anda menghindari stored procedures
seperti wabah, atau tidak dapat melakukan mysql_dump
karena izin, atau menjalankan berbagai alasan lainnya.
Saya akan menyarankan pendekatan tiga langkah seperti ini:
1) Di mana kueri ini membangun banyak kueri sebagai set hasil.
# =================
# 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%'
;
Hasilnya akan terlihat seperti ini:
2) Anda bisa adil Right Click
dan menggunakanCopy Row (tab-separated)
3) Rekatkan hasil di jendela kueri baru dan jalankan ke isi hati Anda.
Detail: Saya mengecualikan skema sistem yang biasanya tidak Anda lihat di meja kerja kecuali Anda memiliki opsi yang Show Metadata and Internal Schemas
diperiksa.
Saya melakukan ini untuk memberikan cara cepat ke ANALYZE
seluruh HOST atau DB jika diperlukan atau menjalankan OPTIMIZE
pernyataan untuk mendukung peningkatan kinerja.
Saya yakin ada berbagai cara yang dapat Anda lakukan untuk melakukan ini, tetapi inilah yang bekerja untuk saya:
-- ========================================== 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';
Diuji pada Versi MySQL: 5.6.23
PERINGATAN: JANGAN RUN INI JIKA:
- Anda khawatir menyebabkan Table-locks (mengawasi koneksi klien Anda)
Anda tidak yakin dengan apa yang Anda lakukan.
Anda mencoba membuat Anda marah DBA. (Anda mungkin memiliki orang-orang di meja Anda dengan kecepatan .)
Cheers, Jay; -]
Saya juga melakukan crawler mysql saya sendiri untuk mencari beberapa konfigurasi wordpress, tidak dapat menemukannya di antarmuka dan database, dan dump database terlalu berat dan tidak dapat dibaca. Saya harus mengatakan saya tidak bisa melakukannya tanpanya sekarang.
Ini berfungsi seperti yang dari @Olivier, tetapi mengelola database eksotis / nama tabel dan LIKE-joker aman.
<?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++;
}
}
Menjalankan skrip ini dapat menghasilkan sesuatu seperti:
---------------------------------------------------
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
Ini adalah permintaan paling sederhana untuk membuka kembali semua Kolom dan Tabel
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
Semua tabel atau tabel dengan nama string tertentu dapat dicari melalui tab Pencarian di phpMyAdmin.
Selamat Mencoba ... \ ^. ^ /
Menggunakan MySQL Workbench mudah untuk memilih beberapa tabel dan menjalankan pencarian teks di semua tabel DB ;-)
Meskipun pertanyaan ini sudah lama, berikut adalah bagaimana Anda bisa melakukannya jika Anda menggunakan mysql workbench 6.3. (Kemungkinan besar itu juga berfungsi untuk versi lain)
Klik kanan skema Anda dan "Cari data tabel", masukkan nilai Anda dan tekan "Mulai Pencarian". Itu dia.
Ini solusi saya untuk ini
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;
CALL findAll('tbl_test','abb')
, saya melewatkan kesalahan ini: # 1267 - Campuran ilegal dari kumpulan (utf8_general_ci, IMPLICIT) dan (utf8_unicode_ci, IMPLICIT) untuk operasi '=' Bisakah Anda memperbaikinya? Terima kasih!
Saya menggunakan HeidiSQL adalah alat yang berguna dan dapat diandalkan yang dirancang untuk pengembang web menggunakan server MySQL yang populer.
Di HeidiSQL Anda dapat menekan shift + ctrl + f dan Anda dapat menemukan teks di server di semua tabel. Opsi ini sangat berguna.
Anda bisa menggunakannya
SHOW TABLES;
Kemudian dapatkan kolom di tabel tersebut (dalam satu lingkaran) dengan
SHOW COLUMNS FROM table;
dan kemudian dengan info itu buat banyak pertanyaan yang Anda juga dapat UNION jika Anda perlu.
Tapi ini sangat berat di database. Khususnya jika Anda melakukan pencarian LIKE.
SHOW TABLES FROM <db_name>
lebih tepat
Solusi ini
a) hanya MySQL, tidak perlu bahasa lain, dan
b) mengembalikan hasil SQL, siap untuk diproses!
#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;
#1243 - Unknown prepared statement handler (stmt) given to EXECUTE
saat menjalankan kueri Anda di Phpmyadmin untuk mencari di seluruh basis data
Saya memodifikasi jawaban PHP dari Olivier sedikit ke:
tampilkan jumlah total hasil
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;
}
Saya membangun jawaban sebelumnya dan memiliki ini, beberapa bantalan tambahan hanya untuk dapat dengan mudah bergabung dengan semua output:
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
Pertama Anda menjalankan ini, lalu tempel dan jalankan hasilnya (tanpa pengeditan) dan itu akan menampilkan semua nama tabel dan kolom di mana nilai tersebut digunakan.
WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')
atau bahkan lebih baik, menjalankannya, memeriksa skema yang digunakan, dan mengatur skema yang digunakan di mana bukan termasuk semua yang lain.
Saya punya ini untuk bekerja. Anda hanya perlu mengubah variabel
$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>";
Saya telah melakukan ini menggunakan HeidiSQL. Ini tidak mudah ditemukan tetapi dengan menekan Ctrl + Shift + F itu akan menampilkan dialog "table tools". Kemudian pilih apa yang ingin Anda cari (Database lengkap ke tabel tunggal) dan masukkan nilai "Teks untuk menemukan" dan klik "Temukan". Saya menemukannya sangat cepat (870MiB db dalam waktu kurang dari satu menit)
Saya menggunakan Union untuk merangkai pertanyaan. Tidak tahu apakah ini cara yang paling efisien, tetapi berhasil.
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
Ada perpustakaan yang bagus untuk membaca semua tabel, 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
}
Saya tidak tahu apakah ini hanya dalam versi terbaru, tetapi mengklik kanan pada Tables
opsi di Navigator
panel muncul opsi yang disebut Search Table Data
. Ini membuka kotak pencarian tempat Anda mengisi string pencarian dan tekan pencarian.
Anda harus memilih tabel yang ingin Anda cari di panel kiri. Tetapi jika Anda menahan shift dan memilih seperti 10 tabel sekaligus, MySql dapat mengatasinya dan mengembalikan hasilnya dalam hitungan detik.
Bagi siapa pun yang mencari opsi yang lebih baik! :)