programing

MySQL 데이터베이스의 모든 테이블에 있는 필드의 텍스트 검색

goodsources 2022. 9. 12. 11:53
반응형

MySQL 데이터베이스의 모든 테이블에 있는 필드의 텍스트 검색

MySQL 데이터베이스의 모든 테이블의 모든 필드에서 특정 문자열을 검색하고 다음과 같은 구문을 사용합니다.

SELECT * FROM * WHERE * LIKE '%stuff%'

이런 일이 가능할까요?

하면 될 것 같아요.SQLDump그런 다음 해당 파일을 검색합니다.

phpMyAdmin이 설치되어 있는 경우 '검색' 기능을 사용하십시오.

  • DB 선택
  • DB가 선택되어 있는지 확인하십시오(테이블이 아닌 경우 완전히 다른 검색 대화 상자가 나타납니다).
  • '검색' 탭을 클릭합니다.
  • 원하는 검색어 선택
  • 검색할 테이블 선택

최대 250개의 테이블/10GB 데이터베이스(고속 서버)에서 사용했는데, 응답 시간이 놀라울 정도입니다.

수 요.information_schema내의 .테이블 내의 모든 테이블과 모든 필드의 목록이 있습니다.그런 다음 이 테이블에서 얻은 정보를 사용하여 조회를 실행할 수 있습니다.

관련된 테이블은 SCHEMATA, TABLES 및 COLUMNS입니다. 스키마에서 테이블을 작성하는 방법을 정확하게 작성할 수 있는 외부 키가 있습니다.

PHP 함수:

function searchAllDB($search){
    global $mysqli;
    
    $out = Array();
    
    $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()){
                    $column = $r2[0];
                    $sql_search_fields[] = "`".$column."` like('%".$mysqli->real_escape_string($search)."%')";
                }
                $rs2->close();
            }
            $sql_search .= implode(" OR ", $sql_search_fields);
            $rs3 = $mysqli->query($sql_search);
            $out[$table] = $rs3->num_rows."\n";
            if($rs3->num_rows > 0){
                $rs3->close();
            }
        }
        $rs->close();
    }
    
    return $out;
}

print_r(searchAllDB("search string"));

이게 내가 아는 간단한 방법이야PHPMyAdmin에서 DB를 선택하고 "Search(검색)" 탭으로 이동하여 찾고 싶은 항목과 검색할 위치를 기입합니다.모든 표에서 단어를 검색하려면 모든 표를 선택합니다.그럼 'GO' 하고 삭제할 Wordpress DB에서 VCD(백도어)라는 단어를 찾고 싶다.결과를 보세요.

★★★를 피하고 있는 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 또는 하거나 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를 화나게 하려고 합니다.(책상에 빠른 직원이 있을 수 있습니다.)

건배, 제이;-]

12년이 지났지만 아무도 다음 질문에 대한 답을 올리지 않았습니다.

MySQL 데이터베이스의 모든 테이블의 모든 필드에서 지정된 문자열을 검색합니다.

Anwser에는 GUI, 막연한 아이디어, 구문 오류, 테이블 이름 또는 접두사가 필요한 절차 및 모든 종류의 왜곡이 포함됩니다.여기에서는, 지금까지의 복수의 회답에 근거해, 실제의 작업, 테스트, 사용하기 쉬운 회답이 작성되고 있습니다.또, 결과에 주요한 키를 추가합니다.

DROP PROCEDURE IF EXISTS findAll;
DELIMITER $$
CREATE PROCEDURE findAll( IN `search` TEXT )
BEGIN
    SET SESSION group_concat_max_len := @@max_allowed_packet;
    SELECT GROUP_CONCAT(
        "SELECT '", c1.TABLE_NAME, "' AS `table`, '", c1.COLUMN_NAME, "' AS `column`, ",
        "CONCAT_WS(',', ",  (SELECT GROUP_CONCAT(c2.column_name) FROM `information_schema`.`columns` c2 WHERE c1.TABLE_SCHEMA=c2.TABLE_SCHEMA AND c1.TABLE_NAME=c2.TABLE_NAME AND c2.COLUMN_KEY='PRI') ,") AS pri,", 
        c1.COLUMN_NAME, " AS value FROM ", c1.TABLE_NAME,
      " WHERE `",c1.COLUMN_NAME,"` LIKE '%", search, "%'" SEPARATOR "\nUNION\n") AS col 
    INTO @sql   
    FROM information_schema.columns c1 
    WHERE c1.TABLE_SCHEMA = DATABASE();
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;

로로그그그그다다 하면 .CALL findAll('foobar');

하지만 그렇지 않다.다음 두 가지 문제가 발생합니다.

  1. MySQL 오류 1436:스레드 스택 오버런
  2. 준비된 명세서를 다시 작성해야 합니다.

하다에 두 을 더하세요./etc/mysql/mysql.conf.d/mysqld.cnf 어디에 cnf하는 것입니다.conf.d디렉토리로 이동합니다.

thread_stack            = 2M
table_definition_cache  = 5000

물론 운영 환경에서 실행해서는 안 됩니다. 안전하지 않고 성능이 저하될 수 있기 때문입니다.

또한 워드프레스 설정을 검색하기 위해 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의 모든 테이블에서 텍스트를 검색할 수 있습니다.

모든 열 및 테이블을 검색하는 가장 간단한 쿼리입니다.

SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'

모든 테이블 또는 이름에 특정 문자열이 있는 테이블은 phpMyAdmin의 검색 탭에서 검색할 수 있습니다.

나이스 쿼리 있음...\^.^/

이 질문은 오래된 질문이지만 mysql workbench 6.3을 사용하고 있는 경우는 다음과 같습니다(다른 버전에서도 유효할 가능성이 높습니다).

스키마와 "Search table data(테이블 데이터 검색)"를 마우스 오른쪽 버튼으로 클릭하고 값을 입력한 후 "Start Search(검색 시작)"를 누릅니다.바로 그거야.

이 문제에 대한 저의 해결방법은 다음과 같습니다.

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;

I use HeidiSQL은 인기 있는 MySQL 서버를 사용하는 웹 개발자들에게 유용하고 신뢰할 수 있는 도구입니다.

HeidiSQL에서는 shift + ctrl + f를 누를 수 있으며, 모든 테이블에서 서버의 텍스트를 찾을 수 있습니다.이 옵션은 매우 유용합니다.

MySQL 워크벤치

여기 몇 가지 지침이 있습니다.

MSQL Workbench를 다운로드하여 설치합니다.

https://www.mysql.com/products/workbench/

설치할 때 Visual Studio C++ 재배포 가능을 설치해야 할 수 있습니다.여기서 입수할 수 있습니다.

https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

x64: vc_redist.x64.exe (64비트 Windows용)

MySQL Workbench를 열 때 호스트 이름, 사용자 및 암호를 입력해야 합니다.

사이드 메뉴바에 [Schemas]탭이 있어 [Schemas]탭을 클릭한 후 데이터베이스를 더블 클릭하여 검색할 데이터베이스를 선택합니다.

그런 다음 [데이터베이스] - [데이터 검색] 메뉴로 이동하고 검색할 텍스트를 입력한 후 [검색 시작]을 누릅니다.

여기에 이미지 설명 입력

하이디Sql

HeidiSql https://www.heidisql.com/download.php을 다운로드하여 설치합니다.

호스트명, 사용자, 패스워드를 입력합니다.

텍스트를 검색하려면 Ctrl+Shift+F를 누릅니다.

여기에 이미지 설명 입력

솔루션 ★★★★
하지 않습니다. a) MySQL은 필요 없습니다
준비 !b) SQL の sql sql sql sql sql 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;

사용할 수 있습니다.

SHOW TABLES;

그런 다음 (루프 내) 테이블 내의 컬럼을 가져옵니다.

SHOW COLUMNS FROM table;

그리고 이 정보로 많은 쿼리를 만들 수 있습니다.필요에 따라 UNION도 할 수 있습니다.

그러나 이것은 데이터베이스에서는 매우 무겁습니다.특히 LIKE 검색을 하는 경우.

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

먼저 이 작업을 수행한 다음 결과를 붙여넣고 실행하면(편집하지 않음), 값이 사용된 모든 테이블 이름과 열이 표시됩니다.

다음 제안을 최종 해결책으로 간주하지 않아도 다음과 같은 방법으로 목표를 달성할 수 있습니다.

SET SESSION group_concat_max_len = 1000000;
SET @search = 'Text_To_Search';

DROP table IF EXISTS table1;
CREATE TEMPORARY TABLE table1 AS 
(SELECT 
    CONCAT('SELECT \'',TABLE_NAME,'\' as \'table_name\',\'',COLUMN_NAME,'\' as \'column_name\',CONVERT(count(*),char) as \'matches\' FROM `',
    TABLE_NAME,'` where `',COLUMN_NAME,'` like \'%',@search,'%\' UNION ') as 'query'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' limit 1000000);

set @query = (SELECT GROUP_CONCAT(t1.`query` SEPARATOR '') as 'final_query' from table1 t1 limit 1);
set @query = (SELECT SUBSTRING(@query, 1, length(@query) - 7));

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

주의해 주십시오.

  1. 옵션: group_concat_max_len limit 1000000이 항상 필요한 것은 아닙니다.서버/IDE 의 설정에 따라서 다릅니다.혹시나 추가했을까봐.

  2. 이 작업을 실행하면 [table_name], [column_name], [column]의 3가지 열 응답이 나타납니다.

  3. 'matches' 열은 주어진 표/열의 발생 횟수입니다.

  4. 이 쿼리는 매우 빠릅니다.

면책사항: 이것은 개인 용도로만 유용합니다.즉, 검색 파라미터가 다른 문자열과 연결되어 있기 때문에 SQL Injection 공격에 민감하기 때문에 프로덕션 시스템에서 사용하지 마십시오.Prod를 만들고 싶다면.ready 함수에서는 LOUP를 사용하여 스토어 프로시저를 작성해야 합니다.

데이터베이스 내의 모든 테이블에서 문자열을 검색하려면 CLI에서 다음 명령을 수행합니다.

mysqldump -u UserName --no-create-info --extended-insert=FALSE DBName -p | grep -i "searchingString"

아니면...

mysqldump -u UserName --no-create-info --extended-insert=FALSE DBName -p | grep -i "searchingString" > searchingString.sql

내가 할 일이 있어변수만 바꾸면 됩니다.

$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를 누르면 "테이블 도구" 대화상자가 표시됩니다.그런 다음 검색할 항목(전체 데이터베이스를 단일 테이블로)을 선택하고 "찾을 텍스트" 값을 입력한 후 "찾기"를 누릅니다.놀라울 정도로 빠른 속도(870MiB db는 1분도 안 됨)를 확인했습니다.

23개의 답이 부족할 경우, 여기 2개가 더 있습니다.데이터베이스 구조 및 내용에 따라 실제로 빠르고 간단한 솔루션이 될 수 있습니다.

셸 원라이너 팬의 경우 긴 것을 다음에 나타냅니다(실제로 변수를 사용하기 위해 2줄에 있습니다).

cmd='mysql -u Username -pYour_Password -D Your_Database' # <-- Adapt this

$cmd -s -e 'SHOW TABLES' | while read table; do echo "=== $table ==="; $cmd -B -s -e "SELECT * FROM $table" | grep 'Your_Search'; done

또는 보다 읽기 쉽게 하기 위해 여러 줄에 걸쳐 다음과 같이 하십시오.

$cmd -s -e 'SHOW TABLES' \
| while read table; do
    echo "=== $table ===";
    $cmd -B -s -e "SELECT * FROM $table" \
    | grep 'Your_Search';
  done
  • -s )--silent는 컬럼 헤더)를 입니다.

  • -B )--batch는 줄과 같은 에 를 사용하면 됩니다.grep

Perl 팬의 경우 정규 표현을 사용할 수 있습니다.

# perl -MDBI -le '($db,$u,$p)=@ARGV; $dbh=DBI->connect("dbi:mysql:dbname=$db",$u,$p); foreach $table ($dbh->tables()) {print "$table\n"; foreach $r ($dbh->selectall_array("SELECT * FROM $table")) {$_=join("\t", @$r); print $_ if (/Your_Regex/);}}' Your_Database Username Your_Password

「실제」Perl 스크립트에서는, 다음과 같습니다.

#!/usr/bin/perl

use strict;
use open qw(:std :utf8);

use DBI;

my $db_host  = 'localhost';
my $db       = 'Your_Database';
my $db_user  = 'Username';
my $db_pass  = 'Your_Password';

my $search    = qr/Your_regex_Search/;


# https://metacpan.org/pod/DBD::mysql
my $dbh = DBI->connect( "dbi:mysql:dbname=$db;host=$db_host", $db_user, $db_pass,
                        { mysql_enable_utf8mb4 => 1 }
) or die "Can't connect: $DBI::errstr\n";


foreach my $table ( $dbh->tables() ) {
    my $sth = $dbh->prepare("SELECT * FROM $table")
        or die "Can't prepare: ", $dbh->errstr;

    $sth->execute
        or die "Can't execute: ", $sth->errstr;

    my @results;

    while (my @row = $sth->fetchrow()) {
        local $_ = join("\t", @row);
        if ( /$search/ ) {
            push @results, $_;
        }
    }

    $sth->finish;

    next unless @results;

    print "*** TABLE $table :\n",
          join("\n---------------\n", @results),
          "\n" . "=" x 20 . "\n";
}

$dbh->disconnect;

난 유니온을 이용해서 질문을 모았어.그게 가장 효율적인 방법인지는 모르겠지만, 효과가 있어요.

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

}

" " " 를 클릭합니다.TablesNavigator에 「이러다」라고 하는 됩니다.Search Table Data그러면 검색 문자열을 입력하고 검색을 누를 수 있는 검색 상자가 열립니다.

왼쪽 창에서 검색할 테이블을 선택해야 합니다.그러나 Shift 키를 누른 상태에서 한 번에 10개 정도의 테이블을 선택하면 MySql이 이를 처리하고 몇 초 만에 결과를 반환합니다.

더 나은 옵션을 찾고 계신 분들을 위해! : )

코드 수준에서 사용하지 않는 경우 정보를 확인하고 전체 데이터베이스를 SQL로 내보낸 다음 텍스트 편집기에서 검색할 수 있습니다.

언급URL : https://stackoverflow.com/questions/639531/search-text-in-fields-in-every-table-of-a-mysql-database

반응형