답변:
information_schema
스키마를 엿볼 수 있습니다 . 모든 테이블 목록과 테이블에있는 모든 필드가 있습니다. 그런 다음이 테이블에서 얻은 정보를 사용하여 쿼리를 실행할 수 있습니다.
관련된 테이블은 SCHEMATA, TABLES 및 COLUMNS입니다. 스키마에서 테이블이 생성되는 방식을 정확하게 구축 할 수 있도록 외래 키가 있습니다.
information_schema
데이터베이스가 아니라 테이블입니다. 어떤 테이블을 검색해야하는지에 대한 설명 information_schema
이 좋을 것입니다!
당신은 할 수있는 SQLDump
데이터베이스 (및 데이터)의를 한 후 해당 파일을 검색 할 수 있습니다.
mysqldump -T
하는 지정된 디렉토리에 테이블 당 두 개의 파일을 생성합니다. 그런 다음 grep <search> *
디렉토리에 반환되며 tablename.txt 또는 .sql 파일이 반환됩니다. txt 파일에는 테이블의 데이터 (탭으로 구분, Excel에서 열기 위해 CSV로 이름 바꾸기)가 있으며 SQL은 테이블 정의를 보유하고 있습니다. 이렇게하면 모든 것을 검색하고 데이터의 위치를 좁히기가 쉽습니다. 이 방법은 특정 환경에서 작업하기가 매우 어려울 수 있습니다. 스택 오버플로는 여기서 매우 유용합니다.
phpMyAdmin이 설치되어 있다면 '검색'기능을 사용하십시오.
나는 이것을 빠른 서버의 최대 250 테이블 / 10GB 데이터베이스에서 사용했으며 응답 시간은 놀랍지 않습니다.
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`"
그래서 예약 단어 필드하지 않습니다 문제 원인
이 프로젝트를 사용할 수 있습니다 : http://code.google.com/p/anywhereindb
모든 테이블의 모든 데이터를 검색합니다.
stored procedures
전염병과 같은 것을 피 하거나 mysql_dump
권한으로 인해 또는 다른 다양한 이유로 부딪 칠 수없는 경우 .
다음과 같은 3 단계 접근 방식을 제안합니다.
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
필요한 경우 전체 HOST 또는 DB에 빠른 방법을 제공 하거나 OPTIMIZE
성능 향상을 지원하기 위해 명령문을 실행 하기 위해이 작업을 수행했습니다.
나는 당신 이 이것을 할 수 있는 다른 방법 이 있다고 확신 하지만 여기에 나에게 맞는 것이 있습니다 :
-- ========================================== 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
경고 :이 경우 다음을 실행하지 마십시오.
- 테이블 잠금을 유발하는 데 관심이 있습니다 (클라이언트 연결을 주시하십시오)
현재하고있는 일이 확실하지 않습니다.
DBA를 화나게하려고합니다. ( 빨리 책상에 사람들이있을 수 있습니다 .)
건배, 제이;-]
또한 자체 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
MySQL Workbench를 사용하면 여러 테이블을 쉽게 선택하고 DB의 모든 테이블에서 텍스트를 쉽게 검색 할 수 있습니다. ;-)
여기 내 해결책이 있습니다.
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')
하면 다음 오류가 발생합니다. # 1267- '='작업에 대한 데이터 정렬 (utf8_general_ci, IMPLICIT)과 (utf8_unicode_ci, IMPLICIT)의 잘못된 조합 을 수정할 수 있습니까? 감사!
HeidiSQL은 널리 사용되는 MySQL 서버를 사용하는 웹 개발자를 위해 설계된 유용하고 안정적인 도구입니다.
HeidiSQL에서 shift + ctrl + f를 누르면 서버의 모든 테이블에서 텍스트를 찾을 수 있습니다. 이 옵션은 매우 유용합니다.
이 솔루션
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;
#1243 - Unknown prepared statement handler (stmt) given to EXECUTE
전체 데이터베이스에서 검색하기 위해 Phpmyadmin에서 쿼리를 실행할 때 오류가 발생 합니다
Olivier의 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;
}
나는 이전 답변을 기반으로하고 이것을 가지고 있으며 모든 출력에 편리하게 결합 할 수있는 추가 패딩입니다.
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
먼저 이것을 실행 한 다음 붙여 넣은 후 결과를 편집 (편집하지 않음)하면 값이 사용되는 모든 테이블 이름과 열이 표시됩니다.
WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')
더 나은 방법으로 실행하고 사용 된 스키마를 확인하고 대신 다른 모든 것을 제외하고 사용 된 스키마를 설정하십시오.
나는 이것을 작동시켰다. 당신은 변수를 변경해야합니다
$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>";
HeidiSQL을 사용 하여이 작업을 수행했습니다. 찾기 쉽지는 않지만 Ctrl + Shift + F를 누르면 "테이블 도구"대화 상자가 표시됩니다. 그런 다음 검색 할 항목을 선택하고 (전체 데이터베이스를 단일 테이블로) "찾을 텍스트"값을 입력하고 "찾기"를 클릭하십시오. 놀랍게도 빠른 것으로 나타났습니다 (1 분 내에 870MiB db)
Union을 사용하여 쿼리를 함께 묶었습니다. 그것이 가장 효율적인 방법인지 모르지만 작동합니다.
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
이것이 최신 버전인지는 모르겠지만 창 에서 Tables
옵션을 마우스 오른쪽 버튼으로 클릭하면Navigator
Search Table Data
. 검색 문자열을 채우고 검색을 수행하는 검색 상자가 열립니다.
왼쪽 창에서 검색하려는 테이블을 선택해야합니다. 그러나 Shift 키를 누른 상태에서 한 번에 10 개의 테이블을 선택하면 MySql이이를 처리하고 결과를 초 단위로 반환 할 수 있습니다.
더 나은 옵션을 찾는 사람이라면 누구나! :)