Programing

mysql 데이터베이스에서 문자열의 모든 항목 검색

crosscheck 2020. 5. 22. 23:40
반응형

mysql 데이터베이스에서 문자열의 모든 항목 검색


이 질문에는 이미 답변이 있습니다.

데이터베이스에서 모든 URL을 찾는 방법을 찾으려고합니다. 모든 테이블과 모든 필드를 검색하고 싶습니다. 그러나 어디서부터 시작해야하는지, 심지어 가능한지 잘 모르겠습니다.


간단한 해결책은 다음과 같습니다.

mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename | grep -i "<search string>"

에서

phpMyAdmin에

는 '검색'기능을 사용할 수 있습니다 :

  1. 테이블이 아닌 특정 데이터베이스를 선택하십시오.
  2. '검색'탭을 클릭하십시오
  3. 원하는 검색어를 입력하십시오
  4. 검색 할 테이블을 선택하십시오

phpMyAdmin

스크린 샷 :

phpMyAdmin 데이터베이스 검색 탭

'검색'기능은

MySQL Workbench

에서도 사용할 수 있습니다 .

  1. 데이터베이스 메뉴> 검색 테이블 데이터
  2. 검색하려는 데이터베이스 및 테이블을 선택하십시오 (선택된 테이블에서만 검색 됨)
  3. 검색에서 wildChars를 사용할 수 있습니다.

MySQL Workbench

스크린 샷 :

MySQL 워크 벤치 데이터베이스 검색


내가 알고있는 오래된 게시물이지만, 내가했던 것처럼 Google을 통해 이것을 찾는 다른 사람들에게는 phpmyadmin이 설치되어 있으면 전역 검색 기능이 있습니다.


MySQL Workbench를 사용하면 "데이터베이스"-> "테이블 데이터 검색"메뉴 옵션에서 문자열을 검색 할 수 있습니다. LIKE % URL_TO_SEARCH %를 지정하고 왼쪽에서 검색하려는 모든 테이블을 선택하십시오. "Cntrl + A"를 사용하여 왼쪽에서 전체 트리를 선택한 다음 관심없는 개체를 선택 취소 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


무차별 대입법

declare @url varchar(255)

set @url = 'stackoverflow.com'

select 'select * from ' + rtrim(tbl.name) + ' where ' + 
          rtrim(col.name) + ' like %' + rtrim(@url) + '%'
from sysobjects tbl
inner join syscolumns col on tbl.id = col.id 
and col.xtype in (167, 175, 231, 239) -- (n)char and (n)varchar, there may be others to include
and col.length > 30 -- arbitrary min length into which you might store a URL
where tbl.type = 'U'    -- user defined table

데이터베이스에서 실행할 수있는 스크립트가 생성됩니다.

select * from table1 where col1 like '%stackoverflow.com%'
select * from table1 where col2 like '%stackoverflow.com%'
select * from table2 where col3 like '%stackoverflow.com%'

기타


Db 덤프를 생성하지 않고

HeidiSQL

을 사용하여이를 수행 할 수 있습니다.

단계

:1) GUI의 왼쪽 패널에서 검색해야 할 데이터베이스를 선택하십시오.2)

내보내기> 데이터베이스를 SQL로 내보내기

3) 테이블 도구 창에서 "

텍스트 찾기

"탭을 선택 하십시오.4) 검색 할 문자열을 제공하고 "

찾기

"를 클릭하십시오 .5) 문자열이 포함 된 모든 테이블을 나열합니다.6)

관련성

이 높은 행을 선택하십시오 % .7) "

결과보기

"를 클릭하십시오

여기에 이미지 설명을 입력하십시오


Wordpress 웹 사이트에서 도메인을 변경할 때 직접 찾고있었습니다. 프로그래밍 없이는 할 수 없으므로 이것이 내가 한 일입니다.

<?php  
  header("Content-Type: text/plain");

  $host = "localhost";
  $username = "root";
  $password = "";
  $database = "mydatabase";
  $string_to_replace  = 'old.example.com';
  $new_string = 'new.example.com';

  // Connect to database server
  mysql_connect($host, $username, $password);

  // Select database
  mysql_select_db($database);

  // List all tables in database
  $sql = "SHOW TABLES FROM ".$database;
  $tables_result = mysql_query($sql);

  if (!$tables_result) {
    echo "Database error, could not list tables\nMySQL error: " . mysql_error();
    exit;
  }

  echo "In these fields '$string_to_replace' have been replaced with '$new_string'\n\n";
  while ($table = mysql_fetch_row($tables_result)) {
    echo "Table: {$table[0]}\n";
    $fields_result = mysql_query("SHOW COLUMNS FROM ".$table[0]);
    if (!$fields_result) {
      echo 'Could not run query: ' . mysql_error();
      exit;
    }
    if (mysql_num_rows($fields_result) > 0) {
      while ($field = mysql_fetch_assoc($fields_result)) {
        if (stripos($field['Type'], "VARCHAR") !== false || stripos($field['Type'], "TEXT") !== false) {
          echo "  ".$field['Field']."\n";
          $sql = "UPDATE ".$table[0]." SET ".$field['Field']." = replace(".$field['Field'].", '$string_to_replace', '$new_string')";
          mysql_query($sql);
        }
      }
      echo "\n";
    }
  }

  mysql_free_result($tables_result);  
?>

앞으로이 문제에 걸려 넘어지는 사람에게 도움이되기를 바랍니다. :)


SQLyog

는 모든 열, 테이블 및 데이터베이스에서 데이터 검색 문제에 대한 GUI 기반 솔루션입니다. 필드, 테이블 및 데이터베이스로 제한하는 검색을 사용자 정의 할 수 있습니다.

Data Search

기능에서 Google을 사용하는 것처럼 문자열을 검색 할 수 있습니다.

SQLyog Datasearch 스크린 샷


bash를 사용할 수 있다면-여기 스크립트가 있습니다 : 데이터베이스에 pass dbread를 가진 사용자 dbread가 필요합니다.

#!/bin/bash
IFS='
'
DBUSER=dbread
DBPASS=dbread
echo -n "Which database do you want to search in (press 0 to see all databases): " 
read DB
echo -n "Which string do you want to search: " 
read SEARCHSTRING
for i in `mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | head -1\``
do
for k in `mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | head -1\` | grep -v int | awk '{print $1}'`
do
if [ `mysql $DB -u$DBUSER -p$DBPASS -e "Select * from $i where $k='$SEARCHSTRING'" | wc -l` -gt 1 ]
then
echo " Your searchstring was found in table $i, column $k"
fi
done
done

누구든지 설명을 원한다면 :

http://infofreund.de/?p=1670


MikeW는 흥미로운 솔루션을 제시했지만 의견에서 언급했듯이 MySQL 솔루션이 아닌 SQL Server 솔루션입니다. 다음은 MySQL 솔루션입니다.

use information_schema;
set @q = 'Boston';
set @t = 'my_db';

select CONCAT('use \'',@q,'\';') as q UNION
select CONCAT('select \'', tbl.`TABLE_NAME`,'\' as TableName, \'', col.`COLUMN_NAME`,'\' as Col, `',col.`COLUMN_NAME`,'` as value  from `' , tbl.`TABLE_NAME`,'` where `' ,
        col.`COLUMN_NAME` , '` like \'%' ,@q,  '%\' UNION') AS q
from `tables` tbl
inner join `columns` col on tbl.`TABLE_NAME` = col.`TABLE_NAME`and col.DATA_TYPE='varchar'
where tbl.TABLE_SCHEMA  =  @t  ;

cla로 전달 된 주어진 문자열에 대해 mysql db를 통과하는 루비 프로그램을 작성했습니다. CLI 버전의 GUI는 없습니다.

https://github.com/amboxer21/DB_search


Found a way with two (2) easy codes here. First do a mysqldump:

mysqldump -uUSERNAME -p DATABASE_NAME > database-dump.sql

then grep the sqldump file:

grep -i "Search string" database-dump.sql

It possible also to find/replace and re-import back to the database.


I can't remember where I came across this script, but I've been using it with XCloner to move my WP multisites.

<?php

    // Setup the associative array for replacing the old string with new string
    $replace_array = array( 'FIND' => 'REPLACE', 'FIND' => 'REPLACE');

    $mysql_link = mysql_connect( 'localhost', 'USERNAME', 'PASSWORD' );
    if( ! $mysql_link) {
        die( 'Could not connect: ' . mysql_error() );
    }

    $mysql_db = mysql_select_db( 'DATABASE', $mysql_link );
    if(! $mysql_db ) {
        die( 'Can\'t select database: ' . mysql_error() );
    }

    // Traverse all tables
    $tables_query = 'SHOW TABLES';
    $tables_result = mysql_query( $tables_query );
    while( $tables_rows = mysql_fetch_row( $tables_result ) ) {
        foreach( $tables_rows as $table ) {

            // Traverse all columns
            $columns_query = 'SHOW COLUMNS FROM ' . $table;
            $columns_result = mysql_query( $columns_query );
            while( $columns_row = mysql_fetch_assoc( $columns_result ) ) {

                $column = $columns_row['Field'];
                $type = $columns_row['Type'];

                // Process only text-based columns
                if( strpos( $type, 'char' ) !== false || strpos( $type, 'text' ) !== false ) {
                    // Process all replacements for the specific column                    
                    foreach( $replace_array as $old_string => $new_string ) {
                        $replace_query = 'UPDATE ' . $table . 
                            ' SET ' .  $column . ' = REPLACE(' . $column . 
                            ', \'' . $old_string . '\', \'' . $new_string . '\')';
                        mysql_query( $replace_query );
                    }
                }
            }
        }
    }

    mysql_free_result( $columns_result );
    mysql_free_result( $tables_result );
    mysql_close( $mysql_link );

    echo 'Done!';

?>

Scott gives a good example of how to do it, but the question is why would you want to? If you need to do a find-and-replace on a specific string, you could also try doing a mysqldump of your database, do a find-and-replace in an editor, then re-load the database.

Maybe if you gave some background on what you are trying to achieve, others might be able to provide better answers.


I was looking for the same but couldn't find it, so I make a small script in PHP, you can find it at: http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/

Good luck! (I remove some private code, let me know if I didn't break it in the process :D)


The first 30 seconds of this video shows how to use the global search feature of Phpmyadmin and it works. it will search every table for a string.

http://www.vodahost.com/vodatalk/phpmyadmin-setup/62422-search-database-phpmyadmin.html


In unix machines, if the database is not too big:

mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S

Not an elegant solution, but you could achieve it with a nested looping structure

// select tables from database and store in an array

// loop through the array
foreach table in database
{
    // select columns in the table and store in an array

    // loop through the array
    foreach column in table
    {
        // select * from table where column = url
    }
}

열 배열을 빌드하는 동안 어떤 열에 문자열이 포함되어 있는지 확인하고 쉼표로 구분 된 하나의 거대한 WHERE 절에서 테이블 당 모든 열을 결합하여 속도를 높일 수 있습니다.참고 URL :

https://stackoverflow.com/questions/562457/search-for-all-occurrences-of-a-string-in-a-mysql-database

반응형