在mysql数据库中搜索所有出现的字符串

Search for all occurrences of a string in a mysql database

本问题已经有最佳答案,请猛点这里访问。

我正试图找出如何在数据库中查找所有出现的URL。我要搜索所有表和所有字段。但我不知道从哪里开始,甚至不知道是否可能。


一个简单的解决方案是这样做:

1
mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename > myfile.sql

然后,您只需在myfile.sql上查找所需的URL。


在phpmyadmin中,"搜索"功能可用:

  • 选择特定数据库而不是表。
  • 单击"搜索"选项卡
  • 输入所需的搜索词
  • 选择要搜索的表
  • phpmyadmin屏幕截图:

    phpMyAdmin Database Search tab

    "search"功能在MySQL Workbench中也可用:

  • 数据库菜单>搜索表数据
  • 选择要搜索的数据库和表(它将只在选定的表中搜索)
  • 在搜索中,您可以使用wildchars。
  • MySQL Workbench屏幕截图:

    MySQL Workbench Database Search


    我知道这篇老文章,但对于像我一样通过谷歌找到它的其他人来说,如果你安装了phpmyadmin,它有一个全局搜索功能。


    使用mysql工作台,您可以从"数据库"->"搜索表数据"菜单选项中搜索字符串。

    指定like%url_to_search%,并在左侧选择要搜索的所有表。您可以使用"cntrl+a"选择左侧的整棵树,然后取消选择您不关心的对象。

    enter image description here


    蛮力法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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

    这将创建一个可以在数据库上执行的脚本。

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

    等。


    您可以通过使用heidisql而不生成db dump来实现这一点。

    步骤:

    1)从GUI左侧面板中选择需要搜索的数据库。

    2)导出>将数据库导出为SQL

    3)在"表格工具"窗口中,选择"查找文本"选项卡。

    4)提供要搜索的字符串,然后单击"查找"。

    5)它将列出包含字符串的所有表。

    6)选择相关性较高的行。

    7)点击"查看结果"

    enter image description here


    当我们在WordPress网站上更改域名时,我自己也在找这个。没有编程是不能完成的,所以这就是我所做的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?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
    MySQL error:"
    . mysql_error();
        exit;
      }

      echo"In these fields '$string_to_replace' have been replaced with '$new_string'

    "
    ;
      while ($table = mysql_fetch_row($tables_result)) {
        echo"Table: {$table[0]}
    "
    ;
        $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']."
    "
    ;
              $sql ="UPDATE".$table[0]." SET".$field['Field']." = replace(".$field['Field'].", '$string_to_replace', '$new_string')";
              mysql_query($sql);
            }
          }
          echo"
    "
    ;
        }
      }

      mysql_free_result($tables_result);  
    ?>

    希望它能帮助任何在将来遇到这个问题的人:)


    对于跨所有列、表和数据库的数据搜索问题,sqlyog是基于GUI的解决方案。可以自定义搜索,将其限制为字段、表和数据库。

    在它的Data Search特性中,可以像使用Google一样搜索字符串。

    SQLyog Datasearch screenshot


    找到了一个方法,这里有两(2)个简单的代码。首先执行mysqldump:

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

    然后grep sqldump文件:

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

    也可以查找/替换并重新导入数据库。


    如果您可以使用bash-下面是一个脚本:它需要一个用户dbread,并在数据库上传递dbread。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/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提出了一个有趣的解决方案,但正如注释中提到的,它是一个SQL Server解决方案,而不是一个MySQL解决方案。这是一个mysql解决方案:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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  ;


    我编写了一个Ruby程序来遍历mysql数据库中作为CLA传递的给定字符串。没有GUI,只有CLI版本。

    https://github.com/amboxer21/db_搜索


    我不记得我是从哪里看到这个脚本的,但我一直在用它来移动我的wp多站点xcloner。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?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!';

    ?>


    此视频的前30秒显示如何使用phpmyadmin的全局搜索功能它起作用了。它将在每个表中搜索一个字符串。

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


    在UNIX机器中,如果数据库不太大:

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

    我也在找,但找不到,所以我用php做了一个小脚本,你可以在下面找到它:http://tequilapp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/

    祝你好运!(我删除了一些私有代码,如果在过程中没有破坏它,请通知我:d)


    斯科特举了一个很好的例子来说明如何做到这一点,但问题是你为什么要这样做?如果需要在特定字符串上执行查找和替换操作,还可以尝试对数据库执行mysqldump操作,在编辑器中执行查找和替换操作,然后重新加载数据库。

    也许,如果你对你正在努力实现的目标提供了一些背景知识,其他人也许能够提供更好的答案。


    不是一个优雅的解决方案,但是您可以用嵌套的循环结构来实现它。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 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子句中来加快速度。