Я пытаюсь выяснить, как найти все вхождения URL-адреса в базе данных. Я хочу искать все таблицы и все поля. Но я не знаю, с чего начать, или если это возможно.
Поиск всех вхождений строки в базе данных mysql
Ответ 1
Простым решением было бы сделать что-то вроде этого:
mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename | grep -i "<search string>"
Ответ 2
В phpMyAdmin доступна функция "Поиск" :
- Выберите конкретную базу данных, а не таблицу.
- Нажмите вкладку "Поиск"
- Введите поисковый запрос, который вы хотите
- Выберите таблицы, которые вы хотите найти в
phpMyAdmin Снимок экрана:
Функция "Поиск" также доступна в MySQL Workbench:
- Меню базы данных > Данные таблицы поиска
- Выберите базу данных и таблицы, которые вы хотите найти (она будет искать только в выбранных таблицах)
- В поиске вы можете использовать wildChars.
Экран Workbench MySQL:
Ответ 3
Старый пост, который я знаю, но для других, которые находят это через Google, как я, если у вас установлен phpmyadmin, он имеет функцию глобального поиска.
Ответ 4
Используя MySQL Workbench, вы можете искать строку из пункта меню "База данных" → "Таблица поиска".
Укажите LIKE% URL_TO_SEARCH%, а с левой стороны выберите все таблицы, которые вы хотите выполнить. Вы можете использовать "Cntrl + A", чтобы выбрать все дерево слева, а затем отменить выбор объектов, которые вам не нужны.
Ответ 5
Метод грубой силы
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
Это создаст script, который вы можете выполнить в базе данных.
select * from table1 where col1 like '%stackoverflow.com%'
select * from table1 where col2 like '%stackoverflow.com%'
select * from table2 where col3 like '%stackoverflow.com%'
и др.
Ответ 6
Вы можете сделать это, используя HeidiSQL без создания дампов Db
Действия
1) Выберите базу данных, которую необходимо найти в левой панели графического интерфейса.
2) Экспорт > Экспорт базы данных в SQL
3) В окне "Инструменты таблицы" выберите " НАЙТИ ТЕКСТ".
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);
?>
Надеюсь, это поможет любому, кто споткнется в эту проблему в будущем:)
Ответ 8
SQLyog - это решение на основе графического интерфейса для поиска данных по всем столбцам, таблицам и базам данных. Можно настроить поиск, ограничивая его полем, таблицей и базами данных.
В своей функции Data Search
можно искать строки так же, как Google.
Ответ 9
Если вы можете использовать bash - вот script: Он нуждается в 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
Ответ 10
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
Я написал программу ruby, чтобы пересечь mysql db для данной строки, переданной как cla. Там нет GUI только версия CLI.
Ответ 12
Найден способ с двумя (2) легкими кодами здесь. Сначала сделайте mysqldump:
mysqldump -uUSERNAME -p DATABASE_NAME > database-dump.sql
затем grep файл sqldump:
grep -i "Search string" database-dump.sql
Это возможно и найти/заменить и re -импорт обратно в базу данных.
Ответ 13
Я не могу вспомнить, где я столкнулся с этим script, но я использовал его с 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!';
?>
Ответ 14
Скотт дает хороший пример того, как это сделать, но вопрос в том, почему вы хотите? Если вам нужно выполнить поиск и замену в определенной строке, вы также можете попробовать выполнить mysqldump вашей базы данных, выполнить поиск и замену в редакторе, а затем повторно загрузить базу данных.Возможно, если бы вы рассказали о том, чего вы пытаетесь достичь, другие могут предоставить более качественные ответы.
Ответ 15
Я искал то же самое, но не смог найти его, поэтому я делаю небольшой script в PHP, вы можете найти его на: http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/
Удачи! (Я удаляю какой-то частный код, дайте мне знать, если я не сломал его в процессе: D)
Ответ 16
Первые 30 секунд этого видео показывают, как использовать функцию глобального поиска Phpmyadmin и это работает. он будет искать каждую таблицу для строки.
http://www.vodahost.com/vodatalk/phpmyadmin-setup/62422-search-database-phpmyadmin.html
Ответ 17
В Unix-машинах, если база данных не слишком большая:
mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S
Ответ 18
Не изящное решение, но вы можете добиться этого с помощью вложенной структуры цикла
// 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.