Ich möchte in allen Feldern aus allen Tabellen einer MySQL-Datenbank eine gegebene Zeichenfolge suchen, möglicherweise mit Syntax wie:
SELECT * FROM * WHERE * LIKE '%stuff%'
Ist es möglich, so etwas zu tun?
Ich möchte in allen Feldern aus allen Tabellen einer MySQL-Datenbank eine gegebene Zeichenfolge suchen, möglicherweise mit Syntax wie:
SELECT * FROM * WHERE * LIKE '%stuff%'
Ist es möglich, so etwas zu tun?
Ich habe dies mit HeidiSQL getan. Es ist nicht leicht zu finden, aber wenn man Strg+Umschalt+F drückt, erscheint der Dialog "Tabellenwerkzeuge". Wählen Sie dann aus, was Sie suchen möchten (gesamte Datenbank oder einzelne Tabelle), geben Sie den Wert für "Zu suchenden Text" ein und klicken Sie auf "Suchen". Ich fand es erstaunlich schnell (870MiB db in weniger als einer Minute)
Falls 23 Antworten nicht ausreichen, hier sind 2 weitere... Je nach Struktur und Inhalt der Datenbank kann eine von ihnen eine schnelle und einfache Lösung sein.
Für Fans von Shell-Einzeilern gibt es hier einen langen (eigentlich 2 Zeilen, um Variablen zu verwenden):
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
Oder auf mehreren Zeilen, um die Lesbarkeit zu verbessern:
$cmd -s -e 'SHOW TABLES' \
| while read table; do
echo "=== $table ===";
$cmd -B -s -e "SELECT * FROM $table" \
| grep 'Your_Search';
done
-s
( --silent
) ist die Unterdrückung der Überschriften der Spaltennamen
-B
( --batch
) umgeht Sonderzeichen wie Zeilenumbrüche, so dass wir den gesamten Datensatz erhalten, wenn wir grep
Und für Perl-Fans: Sie können damit reguläre Ausdrücke verwenden:
# 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
In einem "echten" Perl-Skript könnte das etwa so aussehen:
#!/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;
Ich weiß nicht, ob dies nur in den neueren Versionen der Fall ist, aber ein Rechtsklick auf das Tables
Option in der Navigator
öffnet sich eine Option namens Search Table Data
. Daraufhin öffnet sich ein Suchfeld, in das Sie den Suchbegriff eingeben und auf Suchen klicken.
Sie müssen die Tabelle, in der Sie suchen möchten, im linken Bereich auswählen. Aber wenn Sie die Umschalttaste gedrückt halten und etwa 10 Tabellen auf einmal auswählen, kann MySql damit umgehen und liefert die Ergebnisse innerhalb von Sekunden.
Für alle, die auf der Suche nach besseren Optionen sind! :)
Es gibt eine schöne Bibliothek, in der man alle Tabellen lesen kann, 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
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.