MySQL 데이터베이스의 모든 테이블에서 모든 필드에서 검색
MySQL 데이터베이스의 모든 테이블에서 주어진 문자열을 모든 필드에서 검색하고 싶습니다.
SELECT * FROM * WHERE * LIKE '%stuff%'
이런 식으로 할 수 있습니까?
information_schema
스키마를 엿볼 수 있습니다 . 모든 테이블 목록과 테이블에있는 모든 필드가 있습니다. 그런 다음이 테이블에서 얻은 정보를 사용하여 쿼리를 실행할 수 있습니다.
관련된 테이블은 SCHEMATA, TABLES 및 COLUMNS입니다. 스키마에서 테이블이 생성되는 방식을 정확하게 구축 할 수 있도록 외래 키가 있습니다.
당신은 할 수있는 SQLDump
데이터베이스 (및 데이터)의를 한 후 해당 파일을 검색 할 수 있습니다.
phpMyAdmin이 설치되어 있으면 '검색'기능을 사용하십시오.
- DB를 선택하십시오
- DB가 선택되어 있는지 확인하십시오 (예 : 테이블이 아닌 경우 완전히 다른 검색 대화 상자가 표시됨)
- '검색'탭을 클릭하십시오
- 원하는 검색어를 선택하십시오
- 검색 할 테이블을 선택하십시오
나는 이것을 빠른 서버의 최대 250 테이블 / 10GB 데이터베이스에서 사용했으며 응답 시간은 놀랍지 않습니다.
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()){
$colum = $r2[0];
$sql_search_fields[] = $colum." 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;
}
이 프로젝트를 사용할 수 있습니다 : 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
모든 열과 테이블을 검색하는 가장 간단한 쿼리입니다.
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
phpMyAdmin의 검색 탭을 통해 모든 테이블 또는 특정 문자열 이름을 가진 테이블을 검색 할 수 있습니다.
좋은 질문이있다 ... \ ^. ^ /
MySQL Workbench를 사용하면 여러 테이블을 쉽게 선택하고 DB의 모든 테이블에서 텍스트를 쉽게 검색 할 수 있습니다. ;-)
HeidiSQL은 널리 사용되는 MySQL 서버를 사용하는 웹 개발자를 위해 설계된 유용하고 안정적인 도구입니다.
HeidiSQL에서 shift + ctrl + f를 누르면 서버의 모든 테이블에서 텍스트를 찾을 수 있습니다. 이 옵션은 매우 유용합니다.
여기 내 해결책이 있습니다.
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;
이 질문은 오래되었지만 mysql workbench 6.3을 사용하는 경우 어떻게 할 수 있습니까? (대부분 다른 버전에서도 작동합니다)
스키마와 "테이블 데이터 검색"을 마우스 오른쪽 단추로 클릭하고 값을 입력 한 후 "검색 시작"을 누르십시오. 그게 다야.
이것이 내가 아는 간단한 방법입니다. PHPMyAdmin에서 DB를 선택하고 "검색"탭으로 이동하여 찾고자하는 곳과 검색 할 곳을 작성하십시오. 모든 테이블에서 단어를 검색하려면 모든 테이블을 선택하십시오. 그런 다음 "GO"하고 결과를보십시오.
당신은 사용할 수 있습니다
SHOW TABLES;
그런 다음 해당 테이블의 열을 루프로 가져옵니다.
SHOW COLUMNS FROM table;
그런 다음 해당 정보를 사용하여 필요한 경우 UNION을 수행 할 수있는 많은 쿼리를 만듭니다.
그러나 이것은 데이터베이스에서 매우 무겁습니다. 특히 LIKE 검색을하는 경우.
이 솔루션
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;
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
먼저 이것을 실행 한 다음 붙여 넣은 후 결과를 편집 (편집하지 않음)하면 값이 사용되는 모든 테이블 이름과 열이 표시됩니다.
나는 이것을 작동시켰다. 당신은 변수를 변경해야합니다
$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>";
Union을 사용하여 쿼리를 함께 묶었습니다. 그것이 가장 효율적인 방법인지 모르겠지만 작동합니다.
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
리도 나 모든 테이블을 읽을 수있는 멋진 라이브러리가 있습니다.
$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
}
이것이 최신 버전인지는 모르겠지만 창 에서 Tables
옵션을 마우스 오른쪽 버튼으로 클릭하면이라는 옵션이 Navigator
나타납니다 Search Table Data
. 검색 문자열을 채우고 검색을 수행하는 검색 상자가 열립니다.
왼쪽 창에서 검색하려는 테이블을 선택해야합니다. 그러나 Shift 키를 누른 상태에서 한 번에 10 개의 테이블을 선택하면 MySql에서 해당 테이블을 처리하고 결과를 초 단위로 반환 할 수 있습니다.
더 나은 옵션을 찾는 사람이라면 누구나! :)
HeidiSQL을 사용 하여이 작업을 수행했습니다. 찾기 쉽지는 않지만 Ctrl + Shift + F를 누르면 "테이블 도구"대화 상자가 표시됩니다. 그런 다음 검색 할 항목을 선택하고 (전체 데이터베이스를 단일 테이블로) "찾을 텍스트"값을 입력하고 "찾기"를 클릭하십시오. 놀랍게도 빠른 것으로 나타났습니다 (1 분 내에 870MiB db)
당신이 사용하는 경우 phpMyAdmin
에 따라 이 답변 , 해당 사이트에 이 참조를 .
전체 데이터베이스를 내보내고 .sql 파일에서 검색하십시오.
참고 URL : https://stackoverflow.com/questions/639531/search-in-all-fields-from-every-table-of-a-mysql-database
'IT' 카테고리의 다른 글
PHPMyAdmin에서 가져 오기 파일 크기 제한 (0) | 2020.03.20 |
---|---|
onActivityResult의 요청 코드가 잘못되었습니다 (0) | 2020.03.20 |
Sublime text 2에 눈금자를 항상 표시하는 방법은 무엇입니까? (0) | 2020.03.20 |
PHP에서 다차원 배열에서 중복 값을 제거하는 방법 (0) | 2020.03.20 |
부울 PHP로 문자열을 변환하는 방법 (0) | 2020.03.20 |