Вы можете заглянуть в information_schemaсхему. Он имеет список всех таблиц и всех полей, которые находятся в таблице. Затем вы можете выполнять запросы, используя информацию, полученную из этой таблицы.
Используются таблицы SCHEMATA, TABLES и COLUMNS. Существуют внешние ключи, которые позволяют точно создать таблицы в схеме.
это не тот ответ, который я хотел, но я должен принять правду. : D Спасибо
RSilva
1
Это правильно, но ответ @Dan Rather тоже помог, потому что БД, которую я просматривал, был неясным, и я не мог понять, каким будет имя столбца или таблицы, просто посмотрев ...
DrCord
12
information_schemaэто база данных, а не таблица. Некоторые уточнения, по какой таблице искать, information_schemaбыло бы хорошо!
CaptSaltyJack
3
Для меня довольно забавно, что MySql не предоставляет возможности поиска по всем таблицам. Похоже, довольно рудиментарный вариант
Это «стандартный» (де-факто) способ поиска по всем БД. Мне нравится, mysqldump -Tкоторый создает два файла на таблицу в указанном каталоге. Затем я grep <search> *в директории, и возвращается файл tablename.txt или .sql. Файл txt содержит данные для таблицы (разделитель табуляции, переименование в csv для открытия в Excel), а sql содержит определение таблицы, как вы уже догадались: SQL. Таким образом, вы ищите все, и вы легко сможете определить, где находятся ваши данные. Этот метод может быть довольно трудным для работы в определенных условиях. Переполнение стека очень полезно здесь.
Джоэл Меллон
Если у вас большой SQL или, может быть, в архиве - вы можете открыть его в MC прямо на сервере, а затем просмотреть-> Поиск
Виталий Зданевич
1
Хорошее предложение! Но это не будет работать, если файл дампа БД очень большой (ситуация, которая у меня сейчас :))
Бобан,
207
Если у вас установлен phpMyAdmin, используйте функцию «Поиск».
Выберите свою БД
Убедитесь, что у вас выбрана БД (т.е. не таблица, иначе вы получите совершенно другой диалог поиска)
Нажмите вкладку «Поиск»
Выберите искомое условие
Выберите таблицы для поиска
Я использовал это до 250 таблиц / 10 ГБ баз данных (на быстром сервере), и время отклика просто удивительно.
Одна из наших баз данных - 92,7 Гб, и эта опция работала просто отлично. Отличное решение
Хитрый
5
Я всегда забываю, что может сделать весь phpMyAdmin. Это отличный инструмент!
Вилле
1
Очень быстрый и полезный в моем Magento DB. Через пару секунд нашел поле для данных, которые я искал, а также все другие таблицы, которые на него ссылались.
mtrueblood
1
MySQL Workbench также имеет эту функцию: «База данных >> Поиск в таблице данных ...»
Мэтт Уилки
1
Ницца! Теперь, как бы вы заменили искомую строку в phpmyadmin?
Патрос
46
PHP функция:
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()){$column=$r2[0];$sql_search_fields[]=$column." 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;}
Больше не работает для PHP7. (mysql_connect устарел в PHP 5.5.0, удален в PHP 7.0.0)
iDev247
12
Если вы избегаете, stored proceduresкак чума, или не можете сделать это mysql_dumpиз-за разрешений или сталкиваетесь с другими различными причинами.
Я хотел бы предложить трехэтапный подход, как это:
1) Где этот запрос строит группу запросов в качестве результирующего набора.
#=================# VAR/CHAR SEARCH
#=================# BE ADVISED USEANYOF 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 USEWITH 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 INDEXONORNOT# 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всему HOST или БД, если это необходимо, или для запуска OPTIMIZEоператоров для поддержки повышения производительности.
Я уверен, что есть разные способы сделать это, но вот что работает для меня:
-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEMSELECT 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 THEMSELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,';')FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='dbname';
Проверено на версии MySQL: 5.6.23
ВНИМАНИЕ: НЕ БЕГИТЕ, ЕСЛИ:
Вы обеспокоены тем, чтобы вызывать Table-lock (следите за вашими клиентскими подключениями)
Вы не уверены в том, что делаете.
Вы пытаетесь разозлить вас, администратор БД. (Вы можете иметь людей за столом с быстротой .)
Определенно не то, что вы хотите запустить на живом БД, но полезно для определенных задач отладки. Это терпит неудачу, хотя, если тип столбца не сравнивается со строкой. Т.е. столбец int.
Майкл Тессел
Замечательно, я добавил три альтернативы для поиска по BLOB-объектам, символам или целым числам. Это всего лишь обобщение, и его следует ВСЕГДА использовать с ВНИМАНИЕМ. НИКОГДА о ПРОИЗВОДСТВЕ, как вы уже упоминали, обычно вас увольняют: «Выискиваете скрипты в интернете и не понимаете их, но все же запускаете их», но, эй, так люди учатся трудным путем.
JayRizzo
8
Я также сделал свой собственный сканер mysql для поиска какой-либо конфигурации wordpress, не смог найти ее и в интерфейсе, и в базе данных, а дампы базы данных были слишком тяжелыми и нечитаемыми. Я должен сказать, что не могу обойтись без этого сейчас.
Он работает как @Olivier, но управляет экзотическими именами баз данных / таблиц и безопасен как LIKE-joker.
Я получаю эту ошибку: Неустранимая ошибка: необработанное исключение «PDOException» с сообщением «SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL имеется ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с ключом LIKE REPLACE (REPLACE (REPLACE (REPLACE ('180well *', '\\', '\\\\'), '%) ',' в строке 1 '
LLBBL
6
Это самый простой запрос для извлечения всех столбцов и таблиц.
SELECT*FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA ='YOUR_DATABASE'
Все таблицы или таблицы с определенной строкой в имени можно найти на вкладке Поиск в phpMyAdmin.
при запуске CALL findAll('tbl_test','abb')я пропускаю эту ошибку: # 1267 - Недопустимое сочетание параметров сортировки (utf8_general_ci, IMPLICIT) и (utf8_unicode_ci, IMPLICIT) для операции '=' Вы можете это исправить? Спасибо!
Давуз
6
Это простой способ, который я знаю. Выберите свою БД в PHPMyAdmin и перейдите на вкладку «Поиск» и напишите, что вы хотите найти и где вы будете искать. Выберите все таблицы, если вы будете искать слова из всех таблиц. Тогда «ИДТИ» и посмотрите результат.
+1 Кажется, хорошо справляется со своей работой и является полезным инструментом, который сохраняет ошибки, связанные с некоторыми другими ответами. Также стоит отметить, что он позволяет вам выбирать, в каких базах данных искать.
Стив Чэмберс
3
Вы могли бы использовать
SHOW TABLES;
Затем получите столбцы в этих таблицах (в цикле) с
SHOW COLUMNS FROMtable;
и затем с этой информацией создайте много запросов, которые вы также можете UNION, если вам нужно.
Но это чрезвычайно тяжело для базы данных. Особенно, если вы делаете поиск, как.
Это решение
а) является только 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 allin 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 andexecute the statement
PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;
Для такого рода решений было бы неплохо добавить их в phpfiddler, чтобы люди могли посмотреть и даже прокомментировать ваше решение. :)
pal4life
Я получаю сообщение об ошибке #1243 - Unknown prepared statement handler (stmt) given to EXECUTEпри выполнении запроса в Phpmyadmin для поиска по всей базе данных
Vicky Dev
@ VickyDev Я знаю, что с твоего вопроса прошло больше года. Сожалею. Тем не менее: я думаю, что-то еще не так в вашем скрипте, так как stmt объявлен в строке выше EXECUTE. Какую версию MySQL вы используете?
Чонес
2
Я немного изменил ответ Оливье на 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;}
Я основывался на предыдущем ответе, и у меня есть некоторые дополнительные отступы, чтобы можно было легко объединить все результаты:
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'UNIONSELECT'SELECT '''-- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead
Сначала вы запустите это, затем вставьте и запустите результат (без редактирования), и он отобразит все имена таблиц и столбцы, в которых используется значение.
Четыре проверки значения столбца - не самый простой способ. Вы можете / должны WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')или даже лучше, выполнить его, проверить используемые схемы и установить используемую схему вместо, вместо всех остальных.
bradbury9
1
Я получил это на работу. вам просто нужно изменить переменные
$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>";
Я сделал это с помощью HeidiSQL. Это не легко найти, но нажав Ctrl + Shift + F, он отображает диалог «инструменты таблицы». Затем выберите то, что вы хотите найти (от полной базы данных до одной таблицы), введите значение «Текст для поиска» и нажмите «Найти». Я нашел это удивительно быстро (870 МБ дБ меньше чем за минуту)
Я не знаю, является ли это только в последних версиях, но при щелчке правой кнопкой мыши на Tablesопции в Navigatorпанели появляется опция под названием Search Table Data. Это открывает окно поиска, где вы заполняете строку поиска и нажимаете кнопку поиска.
Вам нужно выбрать таблицу, в которой вы хотите искать на левой панели. Но если вы удерживаете Shift и выбираете около 10 таблиц одновременно, MySql может обработать это и вернуть результаты в считанные секунды.
Ответы:
Вы можете заглянуть в
information_schema
схему. Он имеет список всех таблиц и всех полей, которые находятся в таблице. Затем вы можете выполнять запросы, используя информацию, полученную из этой таблицы.Используются таблицы SCHEMATA, TABLES и COLUMNS. Существуют внешние ключи, которые позволяют точно создать таблицы в схеме.
источник
information_schema
это база данных, а не таблица. Некоторые уточнения, по какой таблице искать,information_schema
было бы хорошо!Вы можете сделать
SQLDump
из базы данных (и ее данных), а затем искать этот файл.источник
mysqldump -T
который создает два файла на таблицу в указанном каталоге. Затем яgrep <search> *
в директории, и возвращается файл tablename.txt или .sql. Файл txt содержит данные для таблицы (разделитель табуляции, переименование в csv для открытия в Excel), а sql содержит определение таблицы, как вы уже догадались: SQL. Таким образом, вы ищите все, и вы легко сможете определить, где находятся ваши данные. Этот метод может быть довольно трудным для работы в определенных условиях. Переполнение стека очень полезно здесь.Если у вас установлен phpMyAdmin, используйте функцию «Поиск».
Я использовал это до 250 таблиц / 10 ГБ баз данных (на быстром сервере), и время отклика просто удивительно.
источник
PHP функция:
источник
$mysqli
так:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
$colum
на"`$colum`"
так, чтобы поля, которые являются зарезервированными словами, не вызывали проблемВы можете использовать этот проект: http://code.google.com/p/anywhereindb
Это будет искать все данные во всей таблице.
источник
Если вы избегаете,
stored procedures
как чума, или не можете сделать этоmysql_dump
из-за разрешений или сталкиваетесь с другими различными причинами.Я хотел бы предложить трехэтапный подход, как это:
1) Где этот запрос строит группу запросов в качестве результирующего набора.
,
,
Результаты должны выглядеть так:
2) Затем вы можете просто
Right Click
и использоватьCopy Row (tab-separated)
3) Вставьте результаты в новое окно запроса и запустите до вашего сердца.
Подробно: я исключаю системные схемы, которые вы обычно не видите в своем рабочем месте, если у вас не выбрана опция
Show Metadata and Internal Schemas
.Я сделал это для обеспечения быстрого доступа ко
ANALYZE
всему HOST или БД, если это необходимо, или для запускаOPTIMIZE
операторов для поддержки повышения производительности.Я уверен, что есть разные способы сделать это, но вот что работает для меня:
Ура, Джей; -]
источник
Я также сделал свой собственный сканер mysql для поиска какой-либо конфигурации wordpress, не смог найти ее и в интерфейсе, и в базе данных, а дампы базы данных были слишком тяжелыми и нечитаемыми. Я должен сказать, что не могу обойтись без этого сейчас.
Он работает как @Olivier, но управляет экзотическими именами баз данных / таблиц и безопасен как LIKE-joker.
Запуск этого скрипта может вывести что-то вроде:
источник
Это самый простой запрос для извлечения всех столбцов и таблиц.
Все таблицы или таблицы с определенной строкой в имени можно найти на вкладке Поиск в phpMyAdmin.
Приятного запроса ... \ ^. ^ /
источник
Используя MySQL Workbench, легко выбрать несколько таблиц и запустить поиск текста во всех этих таблицах БД ;-)
источник
Хотя этот вопрос старый, вот как вы можете это сделать, если используете mysql workbench 6.3. (Скорее всего, это также работает для других версий)
Щелкните правой кнопкой мыши свою схему и «Поиск в таблице данных», введите свое значение и нажмите «Начать поиск». Это оно.
источник
Вот мое решение для этого
источник
CALL findAll('tbl_test','abb')
я пропускаю эту ошибку: # 1267 - Недопустимое сочетание параметров сортировки (utf8_general_ci, IMPLICIT) и (utf8_unicode_ci, IMPLICIT) для операции '=' Вы можете это исправить? Спасибо!Это простой способ, который я знаю. Выберите свою БД в PHPMyAdmin и перейдите на вкладку «Поиск» и напишите, что вы хотите найти и где вы будете искать. Выберите все таблицы, если вы будете искать слова из всех таблиц. Тогда «ИДТИ» и посмотрите результат.
источник
Я использую HeidiSQL - полезный и надежный инструмент, разработанный для веб-разработчиков, использующих популярный сервер MySQL.
В HeidiSQL вы можете нажать shift + ctrl + f и найти текст на сервере во всех таблицах. Эта опция очень полезна.
источник
Вы могли бы использовать
Затем получите столбцы в этих таблицах (в цикле) с
и затем с этой информацией создайте много запросов, которые вы также можете UNION, если вам нужно.
Но это чрезвычайно тяжело для базы данных. Особенно, если вы делаете поиск, как.
источник
SHOW TABLES FROM <db_name>
точнееЭто решение
а) является только MySQL, никакой другой язык не нужен, и
б) возвращает результаты SQL, готовые к обработке!
источник
#1243 - Unknown prepared statement handler (stmt) given to EXECUTE
при выполнении запроса в Phpmyadmin для поиска по всей базе данныхЯ немного изменил ответ Оливье на PHP:
показать общее количество результатов
источник
Я основывался на предыдущем ответе, и у меня есть некоторые дополнительные отступы, чтобы можно было легко объединить все результаты:
Сначала вы запустите это, затем вставьте и запустите результат (без редактирования), и он отобразит все имена таблиц и столбцы, в которых используется значение.
источник
WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')
или даже лучше, выполнить его, проверить используемые схемы и установить используемую схему вместо, вместо всех остальных.Я получил это на работу. вам просто нужно изменить переменные
источник
Я сделал это с помощью HeidiSQL. Это не легко найти, но нажав Ctrl + Shift + F, он отображает диалог «инструменты таблицы». Затем выберите то, что вы хотите найти (от полной базы данных до одной таблицы), введите значение «Текст для поиска» и нажмите «Найти». Я нашел это удивительно быстро (870 МБ дБ меньше чем за минуту)
источник
Я использовал Union для объединения запросов. Не знаю, если это самый эффективный способ, но он работает.
источник
Есть хорошая библиотека для чтения всех таблиц, ридона
источник
Я не знаю, является ли это только в последних версиях, но при щелчке правой кнопкой мыши на
Tables
опции вNavigator
панели появляется опция под названиемSearch Table Data
. Это открывает окно поиска, где вы заполняете строку поиска и нажимаете кнопку поиска.Вам нужно выбрать таблицу, в которой вы хотите искать на левой панели. Но если вы удерживаете Shift и выбираете около 10 таблиц одновременно, MySql может обработать это и вернуть результаты в считанные секунды.
Для тех, кто ищет лучшие варианты! :)
источник