Поиск по всем полям из каждой таблицы базы данных MySQL
Я хочу найти во всех полях из всех таблиц базы данных MySQL заданную строку, возможно, используя синтаксис как:
SELECT * FROM * WHERE * LIKE '%stuff%'
Можно ли сделать что-то подобное?
33 ответа
Вы можете заглянуть в information_schema
схемы. Он имеет список всех таблиц и всех полей, которые находятся в таблице. Затем вы можете выполнять запросы, используя информацию, полученную из этой таблицы.
Используются таблицы SCHEMATA, TABLES и COLUMNS. Существуют внешние ключи, так что вы можете точно определить, как таблицы создаются в схеме.
Вы могли бы сделать SQLDump
базы данных (и ее данные), а затем искать этот файл.
Если у вас установлен phpMyAdmin, используйте функцию "Поиск".
- Выберите свою БД
- Убедитесь, что у вас выбрана БД (т.е. не таблица, иначе вы получите совершенно другой диалог поиска)
- Нажмите вкладку "Поиск"
- Выберите искомое условие
- Выберите таблицы для поиска
Я использовал это до 250 таблиц /10 ГБ баз данных (на быстром сервере), и время отклика просто удивительно.
function searchAllDB($search){
global $mysqli;
$out = "";
$sql = "show tables";
$rs = $mysqli->query($sql);
if($rs->num_rows > 0){
while($r = $rs->fetch_array()){
$table = $r[0];
$out .= $table.";";
$sql_search = "select * from ".$table." where ";
$sql_search_fields = Array();
$sql2 = "SHOW COLUMNS FROM ".$table;
$rs2 = $mysqli->query($sql2);
if($rs2->num_rows > 0){
while($r2 = $rs2->fetch_array()){
$colum = $r2[0];
$sql_search_fields[] = $colum." like('%".$search."%')";
}
$rs2->close();
}
$sql_search .= implode(" OR ", $sql_search_fields);
$rs3 = $mysqli->query($sql_search);
$out .= $rs3->num_rows."\n";
if($rs3->num_rows > 0){
$rs3->close();
}
}
$rs->close();
}
return $out;
}
Вы можете использовать этот проект: http://code.google.com/p/anywhereindb
Это будет искать все данные во всей таблице.
Если вы избегаете stored procedures
как чума, или не в состоянии сделать mysql_dump
из-за разрешений или столкновения с другими различными причинами.
Я хотел бы предложить трехэтапный подход, как это:
1) Где этот запрос строит группу запросов в качестве результирующего набора.
# =================
# VAR/CHAR SEARCH
# =================
# BE ADVISED USE ANY OF THESE WITH CAUTION
# DON'T RUN ON YOUR PRODUCTION SERVER
# ** USE AN ALTERNATE BACKUP **
SELECT
CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' LIKE \'%stuff%\';')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND A.TABLE_SCHEMA != 'innodb'
AND A.TABLE_SCHEMA != 'performance_schema'
AND A.TABLE_SCHEMA != 'information_schema'
AND
(
A.DATA_TYPE LIKE '%text%'
OR
A.DATA_TYPE LIKE '%char%'
)
;
,
# =================
# NUMBER SEARCH
# =================
# BE ADVISED USE WITH CAUTION
SELECT
CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' IN (\'%1234567890%\');')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND A.TABLE_SCHEMA != 'innodb'
AND A.TABLE_SCHEMA != 'performance_schema'
AND A.TABLE_SCHEMA != 'information_schema'
AND A.DATA_TYPE IN ('bigint','int','smallint','tinyint','decimal','double')
;
,
# =================
# BLOB SEARCH
# =================
# BE ADVISED THIS IS CAN END HORRIFICALLY IF YOU DONT KNOW WHAT YOU ARE DOING
# YOU SHOULD KNOW IF YOU HAVE FULL TEXT INDEX ON OR NOT
# MISUSE AND YOU COULD CRASH A LARGE SERVER
SELECT
CONCAT('SELECT CONVERT(',A.COLUMN_NAME, ' USING utf8) FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE CONVERT(',A.COLUMN_NAME, ' USING utf8) IN (\'%someText%\');')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND A.TABLE_SCHEMA != 'innodb'
AND A.TABLE_SCHEMA != 'performance_schema'
AND A.TABLE_SCHEMA != 'information_schema'
AND A.DATA_TYPE LIKE '%blob%'
;
Результаты должны выглядеть так:
2) Тогда можно просто Right Click
и использовать Copy Row (tab separated)
3) Вставьте результаты в новое окно запроса и запустите к своему сердцу содержание.
Подробно: я исключаю системные схемы, которые вы обычно не видите в своем рабочем месте, если у вас нет опции Show Metadata and Internal Schemas
проверено.
Я сделал это, чтобы обеспечить быстрый способ ANALYZE
весь ХОСТ или БД, если необходимо, или запустить OPTIMIZE
заявления в поддержку улучшения производительности.
Я уверен, что есть разные способы сделать это, но вот что работает для меня:
-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEM
SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';
-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO OPTIMIZE THEM
SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';
Проверено на версии MySQL: 5.6.23
ВНИМАНИЕ: НЕ БЕГИТЕ, ЕСЛИ:
- Вы обеспокоены тем, чтобы вызывать блокировки таблиц (следите за вашими клиентскими подключениями)
Вы не уверены, что делаете.
Вы пытаетесь разозлить вас, администратор БД. (у вас могут быть люди на вашем столе с быстротой.)
Ура, Джей;-]
Прошло двенадцать лет, и никто не дал ответа на следующий вопрос:
Я хочу искать во всех полях из всех таблиц базы данных MySQL заданную строку
Anwsers включают графические интерфейсы, расплывчатые идеи, синтаксические ошибки, процедуры, требующие имен таблиц или префиксов, и всевозможные искажения. Вот реальный, работающий, проверенный, простой в использовании ответ, основанный на нескольких ответах.
DROP PROCEDURE IF EXISTS findAll;
DELIMITER $$
CREATE PROCEDURE `findAll`( IN `search` TEXT )
BEGIN
SET SESSION group_concat_max_len := @@max_allowed_packet;
SELECT GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '%",search,"%'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM `information_schema`.`columns`
WHERE TABLE_SCHEMA = DATABASE();
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
Вот и все. Теперь ты можешь сделать
CALL findAll('foobar');
Но нет. Вы столкнетесь с двумя проблемами:
- Ошибка MySQL 1436: переполнение стека потоков
- Подготовленный отчет необходимо подготовить заново.
Добавьте следующие две строки в
/etc/mysql/mysql.conf.d/mysqld.cnf
или где бы то ни было
cnf
есть или сохраните их в отдельном файле и скопируйте в
conf.d
каталог.
thread_stack = 2M
table_definition_cache = 5000
И да, очевидно, что это не должно запускаться в производственной среде, потому что это небезопасно и снижает вашу производительность.
Используя MySQL Workbench, легко выбрать несколько таблиц и запустить поиск текста во всех этих таблицах БД;-)
Я также сделал свой собственный сканер mysql для поиска какой-либо конфигурации wordpress, не смог найти ее и в интерфейсе, и в базе данных, а дампы базы данных были слишком тяжелыми и нечитаемыми. Я должен сказать, что не могу обойтись без этого сейчас.
Он работает как @Olivier, но управляет экзотическими именами баз данных / таблиц и безопасен как LIKE-joker.
<?php
$database = 'database';
$criteria = '*iemblo'; // you can use * and ? as jokers
$dbh = new PDO("mysql:host=127.0.0.1;dbname={$database};charset=utf8", 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$tables = $dbh->query("SHOW TABLES");
while (($table = $tables->fetch(PDO::FETCH_NUM)) !== false)
{
$fields = $dbh->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?");
$fields->execute(array ($database, $table[0]));
$ors = array ();
while (($field = $fields->fetch(PDO::FETCH_NUM)) !== false)
{
$ors[] = str_replace("`", "``", $field[0]) . " LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(:search, '\\\\', '\\\\\\\\'), '%', '\\%'), '_', '\\_'), '*', '%'), '?', '_')";
}
$request = 'SELECT * FROM ';
$request .= str_replace("`", "``", $table[0]);
$request .= ' WHERE ';
$request .= implode(' OR ', $ors);
$rows = $dbh->prepare($request);
$rows->execute(array ('search' => $criteria));
$count = $rows->rowCount();
if ($count == 0)
{
continue;
}
$str = "Table '{$table[0]}' contains {$count} rows matching '{$criteria}'.";
echo str_repeat('-', strlen($str)), PHP_EOL;
echo $str, PHP_EOL;
echo str_repeat('-', strlen($str)), PHP_EOL;
$counter = 1;
while (($row = $rows->fetch(PDO::FETCH_ASSOC)) !== false)
{
$col = 0;
$title = "Row #{$counter}:";
echo $title;
foreach ($row as $column => $value)
{
echo
(($col++ > 0) ? str_repeat(' ', strlen($title) + 1) : ' '),
$column, ': ',
trim(preg_replace('!\s+!', ' ', str_replace(array ("\r", "\t", "\n"), array ("", "", " "), $value))),
PHP_EOL;
}
echo PHP_EOL;
$counter++;
}
}
Запуск этого скрипта может вывести что-то вроде:
---------------------------------------------------
Table 'customers' contains 1 rows matching '*iemblo'.
---------------------------------------------------
Row #1: email_client: my@email.com
numero_client_compta: C05135
nom_client: Tiemblo
adresse_facturation_1: 151, My Street
adresse_facturation_2:
ville_facturation: Nantes
code_postal_facturation: 44300
pays_facturation: FR
numero_tva_client:
zone_geographique: UE
prenom_client: Alain
commentaires:
nom_societe:
email_facturation: my@email.com
MySQL Workbench
Вот несколько инструкций.
Загрузите и установите MSQL Workbench.
https://www.mysql.com/products/workbench/
При установке может потребоваться установить Visual Studio C++ Redistributable. Вы можете получить его здесь:
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
x64: vc_redist.x64.exe (для 64-битной Windows)
Когда вы открываете MySQL Workbench, вам нужно будет ввести имя вашего хоста, пользователя и пароль.
На боковой панели меню есть вкладка "Схемы", щелкните вкладку "Схемы", затем дважды щелкните базу данных, чтобы выбрать базу данных, в которой нужно выполнить поиск.
Затем перейдите в меню База данных - Данные поиска и введите текст, который вы ищете, нажмите Начать поиск.
HeidiSql
Загрузите и установите HeidiSql https://www.heidisql.com/download.php
Введите ваше имя хоста, пользователя и пароль.
Нажмите Ctrl+Shift+F для поиска текста.
Я использую HeidiSQL - полезный и надежный инструмент, разработанный для веб-разработчиков, использующих популярный сервер MySQL.
В HeidiSQL вы можете нажать shift + ctrl + f и найти текст на сервере во всех таблицах. Эта опция очень полезна.
Вот мое решение для этого
DROP PROCEDURE IF EXISTS findAll;
CREATE PROCEDURE `findAll`( IN `tableName` VARCHAR( 28 ) , IN `search` TEXT )
BEGIN
DECLARE finished INT DEFAULT FALSE ;
DECLARE columnName VARCHAR ( 28 ) ;
DECLARE stmtFields TEXT ;
DECLARE columnNames CURSOR FOR
SELECT DISTINCT `COLUMN_NAME` FROM `information_schema`.`COLUMNS`
WHERE `TABLE_NAME` = tableName ORDER BY `ORDINAL_POSITION` ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;
SET stmtFields = '' ;
OPEN columnNames ;
readColumns: LOOP
FETCH columnNames INTO columnName ;
IF finished THEN
LEAVE readColumns ;
END IF;
SET stmtFields = CONCAT(
stmtFields , IF ( LENGTH( stmtFields ) > 0 , ' OR' , '' ) ,
' `', tableName ,'`.`' , columnName , '` REGEXP "' , search , '"'
) ;
END LOOP;
SET @stmtQuery := CONCAT ( 'SELECT * FROM `' , tableName , '` WHERE ' , stmtFields ) ;
PREPARE stmt FROM @stmtQuery ;
EXECUTE stmt ;
CLOSE columnNames ;
END;
Это самый простой запрос для извлечения всех столбцов и таблиц.
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
Все таблицы или таблицы с определенной строкой в имени можно найти на вкладке Поиск в phpMyAdmin.
Приятного запроса... \^.^/
Хотя этот вопрос старый, вот как вы можете это сделать, если используете mysql workbench 6.3. (Скорее всего, это также работает для других версий)
Щелкните правой кнопкой мыши свою схему и "Поиск в таблице данных", введите свое значение и нажмите "Начать поиск". Это оно.
Чтобы найти строку во всех таблицах базы данных, выполните следующую команду в интерфейсе командной строки.
mysqldump -u UserName --no-create-info --extended-insert=FALSE DBName -p | grep -i "searchingString"
Или,
mysqldump -u UserName --no-create-info --extended-insert=FALSE DBName -p | grep -i "searchingString" > searchingString.sql
Это решение
а) только MySQL, другой язык не нужен, и
б) возвращает результаты SQL, готовые к обработке!
#Search multiple database tables and/or columns
#Version 0.1 - JK 2014-01
#USAGE: 1. set the search term @search, 2. set the scope by adapting the WHERE clause of the `information_schema`.`columns` query
#NOTE: This is a usage example and might be advanced by setting the scope through a variable, putting it all in a function, and so on...
#define the search term here (using rules for the LIKE command, e.g % as a wildcard)
SET @search = '%needle%';
#settings
SET SESSION group_concat_max_len := @@max_allowed_packet;
#ini variable
SET @sql = NULL;
#query for prepared statement
SELECT
GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '",@search,"'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM `information_schema`.`columns`
WHERE TABLE_NAME IN
(
SELECT TABLE_NAME FROM `information_schema`.`columns`
WHERE
TABLE_SCHEMA IN ("my_database")
&& TABLE_NAME IN ("my_table1", "my_table2") || TABLE_NAME LIKE "my_prefix_%"
);
#prepare and execute the statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Вы могли бы использовать
SHOW TABLES;
Затем получите столбцы в этих таблицах (в цикле) с
SHOW COLUMNS FROM table;
и затем с этой информацией создайте много запросов, которые вы также можете UNION, если вам нужно.
Но это чрезвычайно тяжело для базы данных. Особенно, если вы делаете поиск, как.
Дамп файла SQL был, вероятно, самым быстрым и быстрым для меня. Также обнаружил другую проблему в любом случае..
Я основывался на предыдущем ответе, и у меня есть некоторые дополнительные отступы, чтобы можно было легко объединить все результаты:
SELECT
CONCAT('SELECT ''',A.TABLE_NAME, '-' ,A.COLUMN_NAME,''' FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' LIKE \'%Value%\' UNION')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND A.TABLE_SCHEMA != 'innodb'
AND A.TABLE_SCHEMA != 'performance_schema'
AND A.TABLE_SCHEMA != 'information_schema'
UNION SELECT 'SELECT '''
-- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead
Сначала вы запустите это, затем вставьте и запустите результат (без редактирования), и он отобразит все имена таблиц и столбцы, в которых используется значение.
Я немного изменил ответ Оливье на PHP:
- распечатать результаты, в которых была найдена строка
- пропустить таблицы без результатов
- также показывать вывод, если имена столбцов соответствуют входным данным поиска
показать общее количество результатов
function searchAllDB($search){ global $mysqli; $out = ""; $total = 0; $sql = "SHOW TABLES"; $rs = $mysqli->query($sql); if($rs->num_rows > 0){ while($r = $rs->fetch_array()){ $table = $r[0]; $sql_search = "select * from ".$table." where "; $sql_search_fields = Array(); $sql2 = "SHOW COLUMNS FROM ".$table; $rs2 = $mysqli->query($sql2); if($rs2->num_rows > 0){ while($r2 = $rs2->fetch_array()){ $colum = $r2[0]; $sql_search_fields[] = $colum." like('%".$search."%')"; if(strpos($colum,$search)) { echo "FIELD NAME: ".$colum."\n"; } } $rs2->close(); } $sql_search .= implode(" OR ", $sql_search_fields); $rs3 = $mysqli->query($sql_search); if($rs3 && $rs3->num_rows > 0) { $out .= $table.": ".$rs3->num_rows."\n"; if($rs3->num_rows > 0){ $total += $rs3->num_rows; $out.= print_r($rs3->fetch_all(),1); $rs3->close(); } } } $out .= "\n\nTotal results:".$total; $rs->close(); } return $out; }
Даже если следующее предложение не следует рассматривать как окончательное решение, вы можете достичь цели, сделав что-то вроде этого:
SET SESSION group_concat_max_len = 1000000;
SET @search = 'Text_To_Search';
DROP table IF EXISTS table1;
CREATE TEMPORARY TABLE table1 AS
(SELECT
CONCAT('SELECT \'',TABLE_NAME,'\' as \'table_name\',\'',COLUMN_NAME,'\' as \'column_name\',CONVERT(count(*),char) as \'matches\' FROM `',
TABLE_NAME,'` where `',COLUMN_NAME,'` like \'%',@search,'%\' UNION ') as 'query'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' limit 1000000);
set @query = (SELECT GROUP_CONCAT(t1.`query` SEPARATOR '') as 'final_query' from table1 t1 limit 1);
set @query = (SELECT SUBSTRING(@query, 1, length(@query) - 7));
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Пожалуйста, помните, что:
Опции: group_concat_max_len и limit 1000000 нужны не всегда, это зависит от конфигурации вашего сервера /IDE. На всякий случай добавил.
После этого вы получите ответ из трех столбцов: [table_name], [column_name], [match]
Столбец "совпадений" - это количество вхождений в данную таблицу / столбец.
Этот запрос выполняется очень быстро.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это было бы полезно только для личного использования, другими словами, пожалуйста, не используйте его в производственной системе, потому что он чувствителен к атакам SQL-инъекций, учитывая, что параметр поиска объединен с другими строками. Если вы хотите создать прод. ready, то вам нужно будет создать процедуру сохранения с помощью LOOP.
Если 23 ответов недостаточно, вот еще 2... В зависимости от структуры и содержимого базы данных вы можете найти один из них, который на самом деле будет быстрым и простым решением.
Для любителей однострочников оболочки, вот длинный (на самом деле 2 строки для использования переменных):
cmd='mysql -u Username -pYour_Password -D Your_Database' # <-- Adapt this
$cmd -s -e 'SHOW TABLES' | while read table; do echo "=== $table ==="; $cmd -B -s -e "SELECT * FROM $table" | grep 'Your_Search'; done
Или в нескольких строках, чтобы было удобнее читать:
$cmd -s -e 'SHOW TABLES' \
| while read table; do
echo "=== $table ===";
$cmd -B -s -e "SELECT * FROM $table" \
| grep 'Your_Search';
done
-s
(--silent
) заключается в подавлении заголовков имен столбцов-B
(--batch
) экранирует специальные символы, такие как символы новой строки, поэтому мы получаем всю запись при использованииgrep
А поклонникам Perl это позволит использовать регулярные выражения:
# perl -MDBI -le '($db,$u,$p)=@ARGV; $dbh=DBI->connect("dbi:mysql:dbname=$db",$u,$p); foreach $table ($dbh->tables()) {print "$table\n"; foreach $r ($dbh->selectall_array("SELECT * FROM $table")) {$_=join("\t", @$r); print $_ if (/Your_Regex/);}}' Your_Database Username Your_Password
Что в "реальном" Perl-скрипте может быть примерно таким:
#!/usr/bin/perl
use strict;
use open qw(:std :utf8);
use DBI;
my $db_host = 'localhost';
my $db = 'Your_Database';
my $db_user = 'Username';
my $db_pass = 'Your_Password';
my $search = qr/Your_regex_Search/;
# https://metacpan.org/pod/DBD::mysql
my $dbh = DBI->connect( "dbi:mysql:dbname=$db;host=$db_host", $db_user, $db_pass,
{ mysql_enable_utf8mb4 => 1 }
) or die "Can't connect: $DBI::errstr\n";
foreach my $table ( $dbh->tables() ) {
my $sth = $dbh->prepare("SELECT * FROM $table")
or die "Can't prepare: ", $dbh->errstr;
$sth->execute
or die "Can't execute: ", $sth->errstr;
my @results;
while (my @row = $sth->fetchrow()) {
local $_ = join("\t", @row);
if ( /$search/ ) {
push @results, $_;
}
}
$sth->finish;
next unless @results;
print "*** TABLE $table :\n",
join("\n---------------\n", @results),
"\n" . "=" x 20 . "\n";
}
$dbh->disconnect;
Я сделал это с помощью HeidiSQL. Это не легко найти, но нажав Ctrl+Shift+F, он отображает диалог "инструменты таблицы". Затем выберите то, что вы хотите найти (от полной базы данных до одной таблицы), введите значение "Текст для поиска" и нажмите "Найти". Я нашел это удивительно быстро (870MB дБ менее чем за минуту)
Я не знаю, если это только в последних версиях, но щелкните правой кнопкой мыши на Tables
вариант в Navigator
панель выскакивает опция под названием Search Table Data
, Это открывает окно поиска, где вы заполняете строку поиска и нажимаете кнопку поиска.
Вам нужно выбрать таблицу, в которой вы хотите искать на левой панели. Но если вы удерживаете Shift и выбираете около 10 таблиц одновременно, MySql может обработать это и вернуть результаты в считанные секунды.
Для тех, кто ищет лучшие варианты!:)
Я получил это на работу. вам просто нужно изменить переменные
$query ="SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`='" . $_SESSION['db'] . "' AND `table_name`='" . $table . "' ";
$stmt = $dbh->prepare($query);
$stmt->execute();
$columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
$query="SELECT name FROM `" . $database . "`.`" . $table . "` WHERE ( ";
foreach ( $columns as $column ) {
$query .=" CONVERT( `" . $column['column_name'] . "` USING utf8 ) LIKE '%" . $search . "%' OR ";
}
$query = substr($query, 0, -3);
$query .= ")";
echo $query . "<br>";
$stmt=$dbh->prepare($query);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r ($results );
echo "</pre>";
Если вы не используете его на уровне кода, вы просто хотите проверить информацию, вы можете экспортировать всю базу данных как SQL, а затем выполнить поиск в текстовом редакторе.
Есть хорошая библиотека для чтения всех таблиц, ридона
$database = new ridona\Database('mysql:dbname=database_name;host=127.0.0.1', 'db_user','db_pass');
foreach ($database->tables()->by_entire() as $row) {
....do
}
Если вы используете phpMyAdmin
следуйте этому ответу, этот сайт это ссылка.