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

时间:2009-02-18 19:23:17

标签: mysql

我正在试图弄清楚如何在数据库中找到所有出现的url。我想搜索所有表格和所有字段。但我不知道从哪里开始,或者甚至可能。

18 个答案:

答案 0 :(得分:187)

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

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

然后你可以在myfile.sql上找到你想要的URL。

答案 1 :(得分:87)

phpMyAdmin 中,可以使用“搜索”功能:

  1. 选择特定数据库而非表格。
  2. 点击“搜索”标签
  3. 输入您想要的搜索字词
  4. 选择要在
  5. 中搜索的表格

    phpMyAdmin 截图:

    phpMyAdmin Database Search tab

    MySQL Workbench

    中也提供了“搜索”功能
    1. 数据库菜单>搜索表数据
    2. 选择要搜索的数据库和表(它将仅在选定的表中搜索)
    3. 在搜索中,您可以使用wildChars。
    4. MySQL Workbench 屏幕截图:

      MySQL Workbench Database Search

答案 2 :(得分:60)

旧帖我知道,但对于其他通过谷歌发现这一点的人,如果你安装了phpmyadmin,它就有了全局搜索功能。

答案 3 :(得分:15)

使用MySQL Workbench,您可以从“数据库”中搜索字符串 - > “搜索表数据”菜单选项。

指定LIKE%URL_TO_SEARCH%,并在左侧选择要搜索的所有表格。您可以使用“Cntrl + A”选择左侧的整个树,然后取消选择您不关心的对象。

enter image description here

答案 4 :(得分:13)

蛮力方法

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%'

答案 5 :(得分:8)

您可以使用HeidiSQL执行此操作而不生成Db转储

<强>步骤

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

2)导出&gt;将数据库导出为SQL

3)在“表格工具”窗口中,选择“查找文本”标签。

4)提供要搜索的字符串,然后点击“查找”。

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

6)选择相关性%的行。

7)点击“查看结果

enter image description here

答案 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);  
?>

希望它可以帮助那些在将来遇到这个问题的人:)

答案 7 :(得分:5)

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

在其Data Search功能中,人们可以像使用Google一样搜索字符串。

SQLyog Datasearch screenshot

答案 8 :(得分:3)

找到一种方法,包含两(2)个简单代码here。首先做一个mysqldump

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

然后grep sqldump文件:

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

possiblefind/replacere-import返回数据库。

答案 9 :(得分:3)

我编写了一个ruby程序来遍历一个mysql数组,以获取作为cla传递的给定字符串。只有CLI版本没有GUI。

https://github.com/amboxer21/DB_search

答案 10 :(得分:3)

MikeW提出了一个有趣的解决方案,但正如评论中所提到的,它是一个SQL Server解决方案而不是MySQL解决方案。这是一个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  ;

答案 11 :(得分:3)

如果你可以使用bash - 这是一个脚本: 它需要一个用户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

答案 12 :(得分:2)

我无法记住我遇到过这个剧本的位置,但我一直在使用它与XCloner一起移动我的WP多站点。

<?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!';

?>

答案 13 :(得分:1)

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

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

答案 14 :(得分:1)

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

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

答案 15 :(得分:1)

我一直在找同样但找不到它,所以我用PHP编写一个小脚本,你可以在以下位置找到它: http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/

祝你好运! (我删除了一些私人代码,如果我在此过程中没有破解它,请告诉我:D)

答案 16 :(得分:1)

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

也许如果你提供了一些关于你想要实现的目标的背景知识,其他人可能会提供更好的答案。

答案 17 :(得分:0)

不是一个优雅的解决方案,但你可以通过嵌套的循环结构实现它

// 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子句中组合每个表的所有列来加快速度。