Câu trả lời:
Bạn có thể nhìn trộm vào information_schema
lược đồ. Nó có một danh sách tất cả các bảng và tất cả các trường trong một bảng. Sau đó, bạn có thể chạy truy vấn bằng cách sử dụng thông tin mà bạn đã nhận được từ bảng này.
Các bảng liên quan là SCHEMATA, BẢNG và MÀU SẮC. Có các khóa ngoại để bạn có thể xây dựng chính xác cách các bảng được tạo trong một lược đồ.
information_schema
là một cơ sở dữ liệu, không phải là một bảng. Một số làm rõ trên bảng nào để tìm kiếm trong information_schema
sẽ tốt!
Bạn có thể thực hiện một SQLDump
cơ sở dữ liệu (và dữ liệu của nó) sau đó tìm kiếm tệp đó.
mysqldump -T
mà tạo hai tệp trên mỗi bảng trong một thư mục được chỉ định. Tôi sau đó grep <search> *
trong thư mục và những gì được trả về là tệp tablename.txt hoặc .sql. Tệp txt giữ dữ liệu cho bảng (được phân định bằng tab, đổi tên thành csv để mở trong Excel) và sql giữ định nghĩa bảng trong, bạn đoán nó: SQL. Bằng cách này, bạn đang tìm kiếm mọi thứ và thật dễ dàng để thu hẹp dữ liệu của bạn. Phương pháp này có thể khá khó khăn để làm việc trong một số môi trường nhất định. Stack Overflow rất hữu ích ở đây.
Nếu bạn đã cài đặt phpMyAdmin, hãy sử dụng tính năng 'Tìm kiếm' của nó.
Tôi đã sử dụng điều này trên tối đa 250 bảng / cơ sở dữ liệu 10 GB (trên máy chủ nhanh) và thời gian phản hồi không có gì đáng ngạc nhiên.
Hàm 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
như thế này:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
$colum
bằng "`$colum`"
để các trường được dành riêng từ sẽ không gây ra sự cố
Bạn có thể sử dụng dự án này: http://code.google.com.vn/p/anywhereindb
Điều này sẽ tìm kiếm tất cả các dữ liệu trong tất cả các bảng.
Nếu bạn đang tránh stored procedures
như bệnh dịch hạch, hoặc không thể thực hiện mysql_dump
do quyền hoặc do các lý do khác nhau.
Tôi muốn đề xuất một cách tiếp cận ba bước như thế này:
1) Trường hợp truy vấn này xây dựng một loạt các truy vấn như một tập kết quả.
# =================
# 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%'
;
Kết quả sẽ như thế này:
2) Sau đó, bạn có thể chỉ Right Click
và sử dụngCopy Row (tab-separated)
3) Dán kết quả vào cửa sổ truy vấn mới và chạy đến nội dung trái tim của bạn.
Chi tiết: Tôi loại trừ lược đồ hệ thống mà bạn có thể không thường thấy trong bàn làm việc của mình trừ khi bạn có tùy chọn Show Metadata and Internal Schemas
được chọn .
Tôi đã làm điều này để cung cấp một cách nhanh chóng cho ANALYZE
toàn bộ HOST hoặc DB nếu cần hoặc để chạy các OPTIMIZE
câu lệnh để hỗ trợ cải thiện hiệu suất.
Tôi chắc chắn có nhiều cách khác nhau bạn có thể thực hiện việc này nhưng đây là những cách phù hợp với tôi:
-- ========================================== 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';
Đã thử nghiệm trên phiên bản MySQL: 5.6.23
CẢNH BÁO: KHÔNG CHẠY NÀY NẾU:
- Bạn lo ngại về việc gây ra Khóa bảng (để mắt đến các kết nối máy khách của bạn)
Bạn không chắc chắn về những gì bạn đang làm.
Bạn đang cố gắng chọc giận bạn DBA. (bạn có thể có người ở bàn làm việc với sự nhanh chóng .)
Chúc mừng, Jay; -]
Tôi cũng đã thực hiện trình thu thập thông tin mysql của riêng mình để tìm kiếm một số cấu hình wordpress, không thể tìm thấy nó trong cả giao diện và cơ sở dữ liệu, và các cơ sở dữ liệu quá nặng và không thể đọc được. Tôi phải nói rằng tôi không thể làm gì nếu không có nó ngay bây giờ.
Nó hoạt động giống như từ @Olivier, nhưng nó quản lý cơ sở dữ liệu / tên bảng kỳ lạ và an toàn cho THÍCH-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++;
}
}
Chạy tập lệnh này có thể xuất ra một cái gì đó như:
---------------------------------------------------
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
Đây là truy vấn đơn giản nhất để truy xuất lại tất cả các Cột và Bảng
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
Tất cả các bảng hoặc những bảng có chuỗi cụ thể trong tên có thể được tìm kiếm thông qua tab Tìm kiếm trong phpMyAdmin.
Có truy vấn đẹp ... \ ^. ^ /
Sử dụng MySQL Workbench, thật dễ dàng để chọn một số bảng và chạy tìm kiếm văn bản trong tất cả các bảng của DB ;-)
Đây là giải pháp của tôi cho việc này
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')
, tôi bỏ lỡ lỗi này: # 1267 - Hỗn hợp bất hợp pháp (utf8_general_ci, IMPLICIT) và (utf8_unicode_ci, IMPLICIT) cho hoạt động '=' Bạn có thể sửa nó không? Cảm ơn!
Tôi đang sử dụng HeidiSQL là một công cụ hữu ích và đáng tin cậy được thiết kế cho các nhà phát triển web sử dụng máy chủ MySQL phổ biến.
Trong HeidiSQL, bạn có thể đẩy shift + ctrl + f và bạn có thể tìm thấy văn bản trên máy chủ trong tất cả các bảng. Tùy chọn này rất hữu ích.
Bạn đã có thể sử dụng
SHOW TABLES;
Sau đó lấy các cột trong các bảng đó (trong một vòng lặp) với
SHOW COLUMNS FROM table;
và sau đó với thông tin đó tạo ra nhiều truy vấn mà bạn cũng có thể UNION nếu bạn cần.
Nhưng điều này là vô cùng nặng nề trên cơ sở dữ liệu. Đặc biệt nếu bạn đang thực hiện một tìm kiếm THÍCH.
SHOW TABLES FROM <db_name>
chính xác hơn
Giải pháp này
a) chỉ là MySQL, không cần ngôn ngữ nào khác và
b) trả về kết quả SQL, sẵn sàng xử lý!
#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
khi chạy truy vấn của bạn trong Phpmyadmin vì đã tìm kiếm trong toàn bộ cơ sở dữ liệu
Tôi đã sửa đổi câu trả lời PHP của Olivier một chút thành:
hiển thị tổng số kết quả
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;
}
Tôi đã xây dựng trên một câu trả lời trước đó và có câu trả lời này, một số phần đệm thêm chỉ để có thể thuận tiện tham gia tất cả đầu ra:
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
Đầu tiên bạn chạy cái này, sau đó dán vào và chạy kết quả (không chỉnh sửa) và nó sẽ hiển thị tất cả các tên bảng và cột trong đó giá trị được sử dụng.
WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')
hoặc thậm chí tốt hơn, thực hiện nó, kiểm tra các lược đồ được sử dụng và đặt lược đồ được sử dụng ở nơi thay vì loại trừ tất cả các lược đồ khác.
tôi đã làm việc này bạn chỉ cần thay đổi các biến
$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>";
Tôi đã làm điều này bằng cách sử dụng HeidiSQL. Không dễ tìm nhưng bằng cách nhấn Ctrl + Shift + F, nó sẽ hiển thị hộp thoại "công cụ bảng". Sau đó chọn những gì bạn muốn tìm kiếm (Toàn bộ cơ sở dữ liệu vào một bảng) và nhập giá trị "Văn bản cần tìm" và nhấp vào "Tìm". Tôi tìm thấy nó nhanh đáng ngạc nhiên (870MiB db trong vòng chưa đầy một phút)
Tôi đã sử dụng Union để xâu chuỗi các truy vấn lại với nhau. Không biết đó là cách hiệu quả nhất, nhưng nó hoạt động.
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
Tôi không biết nếu điều này chỉ có trong các phiên bản gần đây, nhưng nhấp chuột phải vào Tables
tùy chọn trong Navigator
khung sẽ bật lên một tùy chọn được gọi Search Table Data
. Điều này sẽ mở ra một hộp tìm kiếm nơi bạn điền vào chuỗi tìm kiếm và nhấn tìm kiếm.
Bạn cần phải chọn bảng bạn muốn tìm kiếm ở khung bên trái. Nhưng nếu bạn giữ phím shift và chọn như 10 bảng cùng một lúc, MySql có thể xử lý điều đó và trả về kết quả sau vài giây.
Đối với bất cứ ai đang tìm kiếm lựa chọn tốt hơn! :)