IT

MySQL 데이터베이스의 모든 테이블에서 모든 필드에서 검색

lottoking 2020. 3. 20. 08:30
반응형

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

경고 :이 경우 다음을 실행하지 마십시오.

  1. 테이블 잠금을 유발하는 데 관심이 있습니다 (클라이언트 연결을 주시하십시오)
  2. 현재하고있는 일이 확실하지 않습니다.

  3. 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"하고 결과를보십시오.Wordpress DB에서 VCD (backdoor)라는 단어를 찾아 삭제하려고합니다.


당신은 사용할 수 있습니다

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

반응형