Voglio cercare in tutti i campi da tutte le tabelle di un database MySQL una determinata stringa, possibilmente usando la syntax come:
SELECT * FROM * WHERE * LIKE '%stuff%'
È ansible fare qualcosa di simile?
Puoi dare uno sguardo allo schema information_schema
. Ha un elenco di tutte le tabelle e tutti i campi che si trovano in una tabella. È quindi ansible eseguire query utilizzando le informazioni ottenute da questa tabella.
Le tabelle coinvolte sono SCHEMATA, TABLES e COLUMNS. Esistono chiavi esterne che consentono di creare esattamente il modo in cui le tabelle vengono create in uno schema.
Si potrebbe fare un SQLDump
del database (e dei suoi dati), quindi cercare quel file.
Se phpMyAdmin è installato, usa la funzione ‘Cerca’.
Ho usato questo su fino a 250 database table / 10GB (su un server veloce) e il tempo di risposta è a dir poco sorprendente.
Puoi utilizzare questo progetto: http://code.google.com/p/anywhereindb
Questo cercherà tutti i dati in tutte le tabelle.
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; }
Se stai evitando stored procedures
come la peste, o non sei in grado di fare un mysql_dump
causa di permessi, o di imbatterti in altri vari motivi.
Vorrei suggerire un approccio in tre fasi come questo:
1) Dove questa query crea una serie di query come set di risultati.
# ================= # 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%' ;
I risultati dovrebbero assomigliare a questo:
2) È quindi ansible fare Right Click
e utilizzare la Copy Row (tab separated)
3) Incolla i risultati in una nuova finestra di query ed esegui il contenuto del tuo cuore.
Dettagli: Escludo schemi di sistema che potresti non vedere nel tuo workbench a meno che tu non abbia l’opzione Show Metadata and Internal Schemas
selezionati.
L’ho fatto per fornire un modo rapido per ANALYZE
un intero HOST o DB, se necessario, o per eseguire le istruzioni OPTIMIZE
per supportare i miglioramenti delle prestazioni.
Sono sicuro che ci sono diversi modi per farlo, ma ecco cosa funziona per me:
-- ========================================== 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';
Testato su versione MySQL: 5.6.23
ATTENZIONE: NON ESEGUIRE QUESTA SE:
- Sei preoccupato di causare blocchi di tabella (tieni d’occhio le connessioni client)
Non sei sicuro di quello che stai facendo.
Stai cercando di farti arrabbiare con DBA. (potresti avere persone alla tua scrivania con la rapidità .)
Saluti, Jay; -]
Ho anche fatto il mio mysql crawler per cercare alcune configurazioni di wordpress, non è stato in grado di trovarlo sia nell’interfaccia che nel database, e i dump del database erano troppo pesanti e illeggibili. Devo dire che non posso farne a meno ora.
Funziona come quello di @Olivier, ma gestisce database esotici / nomi di tabelle ed è LIKE-joker sicuro.
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++; } }
L’esecuzione di questo script potrebbe produrre qualcosa come:
--------------------------------------------------- Table 'customers' contains 1 rows matching '*iemblo'. --------------------------------------------------- Row #1: email_client: [email protected] 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: [email protected]
Questa è la query più semplice per recuperare tutte le colonne e le tabelle
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
Tutte le tabelle o quelle con una stringa specifica nel nome potrebbero essere ricercate tramite la scheda Cerca in phpMyAdmin.
Fai una bella domanda … \ ^. ^ /
Usando MySQL Workbench è facile selezionare diverse tabelle ed eseguire una ricerca di testo in tutte quelle tabelle del DB 😉
Uso HeidiSQL è uno strumento utile e affidabile progettato per gli sviluppatori web che utilizzano il famoso server MySQL.
In HeidiSQL puoi premere shift + ctrl + f e puoi trovare testo sul server in tutte le tabelle. Questa opzione è molto utile.
Ecco la mia soluzione per questo
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;
Potresti usare
SHOW TABLES;
Quindi ottenere le colonne in quelle tabelle (in un ciclo) con
SHOW COLUMNS FROM table;
e poi con quelle informazioni crei molte domande che puoi anche UNION se ti serve.
Ma questo è estremamente pesante sul database. Specialmente se stai facendo una ricerca LIKE.
Il dump del file SQL è stato probabilmente il più veloce e veloce per me. Anche scoperto un altro problema comunque ..
Ho modificato la risposta PHP di Olivier un po ‘a:
mostra il numero totale di risultati
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; }
Anche se questa domanda è vecchia, ecco come puoi farlo se stai usando mysql workbench 6.3. (Molto probabilmente funziona anche per altre versioni)
Fai clic con il pulsante destro del mouse sul tuo schema e su “Cerca dati tabella”, inserisci il tuo valore e premi “Inizia ricerca”. Questo è tutto.
Questa soluzione
a) è solo MySQL, non è richiesta altra lingua e
b) restituisce risultati SQL, pronti per l’elaborazione!
#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, eg % 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;
Esportare l’intero database e cercare nel file .sql.
Se stai usando phpMyAdmin
segui questa risposta , quel sito questo riferimento .
Ho usato Union per mettere insieme le query. Non so se è il modo più efficiente, ma funziona.
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union SELCET * FROM table2 WHERE name LIKE '%Bob%';
C’è una bella biblioteca per leggere tutti i tavoli, ridona
$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 }
Non so se questo è solo nelle versioni recenti, ma facendo clic destro sull’opzione Tables
nel riquadro Navigator
apre un’opzione chiamata Search Table Data
. Questo apre una casella di ricerca in cui inserisci la stringa di ricerca e premi la ricerca.
È necessario selezionare la tabella che si desidera cercare nel riquadro di sinistra. Ma se si tiene premuto shift e si seleziona come 10 tabelle alla volta, MySql può gestirlo e restituire i risultati in pochi secondi.
Per chi è alla ricerca di opzioni migliori! 🙂
Ho costruito una risposta precedente e ho questo, un po ‘di padding in più solo per essere in grado di unire convenientemente tutto l’output:
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
Per prima cosa esegui questo, quindi incollalo ed esegui il risultato (nessuna modifica) e visualizzerà tutti i nomi e le colonne delle tabelle in cui viene utilizzato il valore.
ho questo a lavorare hai solo bisogno di cambiare le variabili
$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 . "
"; $stmt=$dbh->prepare($query); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); echo ""; print_r ($results ); echo "
";