HOWTO · MySQL

Überprüfen Sie, ob String bestimmte Daten in MySQL enthält

Dieses Tutorial zeigt, wie Sie überprüfen, ob eine Zeichenfolge bestimmte Daten oder eine Teilzeichenfolge in einer MySQL-Tabelle enthält.

Auf dieser Seite

Um in MySQL Zeilen zu finden, deren Text einen Teilstring enthält, filtern Sie mit WHERE LOCATE('widget', product_name) > 0, WHERE INSTR(product_name, 'widget') > 0 oder WHERE product_name LIKE '%widget%'. LOCATE() und INSTR() suchen nach einem wörtlichen Teilstring; LIKE eignet sich, wenn die Suche Platzhalter benötigt. Die folgenden Beispiele verwenden dieselbe kleine Tabelle products, damit Sie die passende Form für Ihre Abfrage auswählen können.

Eine Beispieltabelle für die Suche nach Teilstrings einrichten

Erstellen Sie eine Tabelle mit einer Kennung und einem Produktnamen und fügen Sie dann einige Zeilen hinzu, die den Suchbegriff enthalten oder nicht enthalten. In einer MySQL-Sitzung lässt sich die Tabelle mit CREATE TABLE products (product_id INT PRIMARY KEY, product_name VARCHAR(255)); anlegen. Fügen Sie anschließend mit INSERT INTO products (product_id, product_name) VALUES (1, 'Gadget Widget'), (2, 'Electronic Widget'), (3, 'Toy Widget'), (4, 'Tool Set'); einige Datensätze ein.

Drei Namen in diesem Datensatz enthalten Widget, einer nicht. Die folgenden Abfragen wählen die ersten drei Zeilen aus. Die SQL-Beispiele sind für die Ausführung in MySQL gedacht. Für diese Artikelaufgabe liegen keine Ausführungsnachweise eines MySQL-Dienstes vor; die Ergebnisse werden daher beschrieben und nicht als beobachtete MySQL-Kommandoausgabe dargestellt. Führen Sie in Ihrer eigenen Datenbank die Tabellendefinition und das Einfügen der Datensätze einmal aus, bevor Sie die Suchabfragen ausprobieren. Falls bereits eine Tabelle namens products vorhanden ist, verwenden Sie einen anderen Tabellennamen oder passen Sie die Einrichtung an Ihr Schema an.

Diese lokale Python-Prüfung bildet die erwarteten Treffer des Beispiels nach; sie führt MySQL nicht aus. Sie gibt die Produktnamen aus, die Widget enthalten.

products = [
    (1, "Gadget Widget"),
    (2, "Electronic Widget"),
    (3, "Toy Widget"),
    (4, "Tool Set"),
]

for product_id, product_name in products:
    if "Widget" in product_name:
        print(product_id, product_name)
1 Gadget Widget
2 Electronic Widget
3 Toy Widget

Mit LOCATE() und INSTR() nach einem Teilstring suchen

Verwenden Sie LOCATE(), wenn der Suchbegriff das erste und der Spaltenwert das zweite Argument ist: LOCATE(substring, string). Die Funktion gibt die Position des ersten Treffers zurück, beginnend bei 1, oder 0, wenn es keinen Treffer gibt. Wenn Sie das Ergebnis in einer WHERE-Bedingung mit > 0 vergleichen, bleiben nur Zeilen übrig, in denen der Teilstring vorkommt. Für diese Tabelle lautet die Abfrage: SELECT product_id, product_name FROM products WHERE LOCATE('Widget', product_name) > 0;. Sie trifft auf die IDs 1, 2 und 3 zu.

INSTR() prüft dieselben Werte, verwendet die Argumente aber in umgekehrter Reihenfolge: INSTR(string, substring). Auch diese Funktion gibt die Position des ersten Treffers oder 0 zurück, wenn der Teilstring fehlt. Die entsprechende Abfrage lautet: SELECT product_id, product_name FROM products WHERE INSTR(product_name, 'Widget') > 0;. Sie liefert dieselben drei Zeilen. Wenn Sie zwischen den beiden Funktionen wechseln, müssen Sie vor allem die Reihenfolge ihrer Argumente beachten.

Beide Funktionen suchen den angegebenen Teilstring im Spaltenwert. Sie eignen sich, wenn Sie nach einem konkreten, bereits bekannten Wert suchen. Das Ergebnis ist eine Position, keine Zeile; erst die WHERE-Bedingung macht aus diesem Zahlenwert einen Zeilenfilter. Wählen Sie anstelle von * nur die Spalten aus, die Ihre Anwendung benötigt, damit sich das Ergebnis leichter verwenden lässt.

Ob bei einem Vergleich Groß- und Kleinschreibung berücksichtigt wird, hängt von der Sortierung (Collation) der Spalte oder des Ausdrucks ab. Die Beispielabfragen verwenden Widget, passend zur Groß- und Kleinschreibung der Beispieldaten. Prüfen Sie die Sortierung Ihrer Spalte, wenn die Ergebnisse hinsichtlich der Groß- und Kleinschreibung anders ausfallen als erwartet. Gehen Sie nicht davon aus, dass sich jeder MySQL-Vergleich gleich verhält.

Mit LIKE Teilstrings und Muster abgleichen

Der Operator LIKE vergleicht einen Spaltenwert mit einem Muster. Ohne Platzhalter wird das Muster mit dem gesamten Wert verglichen: product_name LIKE 'Widget' sucht nach einem Wert, der Widget entspricht, und nicht nach diesen Buchstaben irgendwo innerhalb eines längeren Namens. Soll der Begriff an beliebiger Stelle im Wert vorkommen, setzen Sie % auf beide Seiten: SELECT product_id, product_name FROM products WHERE product_name LIKE '%Widget%';. Dieses Muster für die Suche nach enthaltenem Text trifft in der Beispieltabelle auf die IDs 1, 2 und 3 zu.

Der Platzhalter % steht für null oder mehr Zeichen. Stellen Sie ihn vor einen Begriff, um Werte zu finden, die mit diesem Begriff enden, etwa mit product_name LIKE '%Widget'. Stellen Sie ihn dahinter, um Werte zu finden, die damit beginnen, etwa mit product_name LIKE 'Toy%'. Mit % auf beiden Seiten lassen sich Zeichen vor und nach dem Begriff zulassen. So können Sie festlegen, an welcher Stelle der Text vorkommen soll, ohne die umgebenden Zeichen genau anzugeben.

Der Platzhalter _ steht für genau ein Zeichen. Zum Beispiel trifft product_name LIKE 'Gadget_Widget' auf einen Wert zu, der zunächst Gadget, dann ein Zeichen und anschließend Widget enthält. In diesem Datensatz passt das auf Gadget Widget, wobei das Zeichen dazwischen ein Leerzeichen ist. % und _ haben unterschiedliche Aufgaben: Der erste Platzhalter erlaubt eine Zeichenfolge beliebiger Länge, der zweite genau ein Zeichen an dieser Stelle.

Verwenden Sie LIKE, wenn das benötigte Suchmuster die Suche ausdrückt, und LOCATE() oder INSTR() für eine direkte Teilstringsuche. Sollen % oder _ bei einer wörtlichen Suche als normale Zeichen behandelt werden, maskieren Sie sie nach den MySQL-Regeln für Escape-Zeichen in LIKE, statt sie als Platzhalter stehen zu lassen. Diese Bedingungen filtern Zeilen; sie validieren keine Benutzereingaben. Wenn ein Suchbegriff von einem Benutzer stammt, übergeben Sie ihn als Parameter über Ihren Datenbank-Client und richten Sie sich bei der Parameterbindung nach dessen Anleitung.