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

gre*_*egh 177 mysql

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

Pao*_*ino 197

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

mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename | grep -i "<search string>"
Run Code Online (Sandbox Code Playgroud)

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

  • 你甚至不需要创建一个文件:mysqldump -u myuser | grep http://stackoverflow.com (41认同)
  • @SchlaWeiner只是转储数据; 你不知道行模式或表. (13认同)
  • http://www.adminer.org/在查找所有表中的文本(给定指定的数据库)方面做得非常好. (2认同)
  • 如果你赶时间,这是有道理的... (2认同)

mur*_*dev 94

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

  1. 选择特定数据库而不是表.
  2. 点击"搜索"标签
  3. 输入您想要的搜索词
  4. 选择要搜索的表

phpMyAdmin屏幕截图:

phpMyAdmin数据库搜索选项卡

MySQL Workbench中也提供了"搜索"功能:

  1. 数据库菜单>搜索表数据
  2. 选择要搜索的数据库和表(它将仅在选定的表中搜索)
  3. 在搜索中,您可以使用wildChars.

MySQL Workbench屏幕截图:

MySQL Workbench数据库搜索


小智 61

我知道的旧帖子,但对于其他通过Google发现这个的帖子,如果你安装了phpmyadmin,它有一个全局搜索功能.

  • 您的帖子不应低于广告. (4认同)
  • 我更喜欢HeidiSQL和phpMyAdmin.价格相同,使用起来更方便,功能更强大.也更快. (2认同)

Gur*_*eet 17

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

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

在此输入图像描述


Mik*_*keW 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
Run Code Online (Sandbox Code Playgroud)

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

select * from table1 where col1 like '%stackoverflow.com%'
select * from table1 where col2 like '%stackoverflow.com%'
select * from table2 where col3 like '%stackoverflow.com%'
Run Code Online (Sandbox Code Playgroud)

等等

  • 对于这个纯粹酷酷的hackish感觉+1 (2认同)

Pra*_*K C 10

您可以通过使用HeidiSQL而不生成Db转储来实现此目的

步骤:

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

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

3)在Table Tools窗口中,选择" FIND TEXT "选项卡.

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

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

6)选择具有较高相关性%的行.

7)点击" 查看结果 "

在此输入图像描述


小智 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);  
?>
Run Code Online (Sandbox Code Playgroud)

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


jsi*_*ist 5

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

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

SQLyog Datasearch截图


Bri*_*ian 5

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  ;
Run Code Online (Sandbox Code Playgroud)

  • 很近。一些问题: 1. 这会产生一个无效的尾随`UNION`。2. 第四行应该是`select CONCAT('use \'',@t,'\';') as q UNION` 3. 变量不明确。称它们为`@search` 和`@database` 可能更好 (2认同)

Che*_*ana 5

找到一种方法,有两个(2)易码在这里。首先做一个mysqldump

mysqldump -uUSERNAME -p DATABASE_NAME > database-dump.sql
Run Code Online (Sandbox Code Playgroud)

然后grep sqldump 文件:

grep -i "Search string" database-dump.sql
Run Code Online (Sandbox Code Playgroud)

可能还可以查找/替换重新导入到数据库中。