361 Stimmen

Text in Feldern in jeder Tabelle einer MySQL-Datenbank suchen

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?

1voto

R1CHY_RICH Punkte 68

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)

1voto

mivk Punkte 11443

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;

0voto

Crazy Cucumber Punkte 459

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! :)

0voto

mirhossein Punkte 514

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

}

0voto

mrmills129 Punkte 51

Ich habe Union verwendet, um Abfragen aneinanderzureihen. Ich weiß nicht, ob das die effizienteste Methode ist, aber sie funktioniert.

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';

CodeJaeger.com

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.

Powered by:

X