Warum stimmt "_" (Unterstrich) mit "-" (Bindestrich) überein?


110

Ich muss mit dieser Abfrage nach einem PDF-Handbuch suchen:

root@localhost:test> select * from a where name like '%taz_manual%.pdf%';
+--------------------+------------------+-------------+
| name               | description      |        size | 
+--------------------+------------------+-------------+
| taz-manual-1.1.pdf | Manual v1.0 TA-Z |    31351902 |
| taz-manual-0.2.pdf | Manual v1.0 T1-A |     3578278 |
| taz_manual-2.0.pdf | Manual v2.0 GA-X |   542578278 |
etc........
+--------------------+------------------+-------------+
132 row in set (0.00 sec)

Warum sehe ich den mit Bindestrichen, wenn ich den Namen angeben soll taz_manual%.pdf?

Antworten:


231

Weil der Unterstrich _ein Platzhalter wie der Prozentsatz ist %, außer dass nur ein Zeichen gesucht wird.

Mit dem SQL-Mustervergleich können Sie "_" verwenden, um ein einzelnes Zeichen abzugleichen, und "%", um eine beliebige Anzahl von Zeichen (einschließlich Nullzeichen) abzugleichen.

(Ab Abschnitt 3.3.4.7. Pattern Matching in der MySQL-Dokumentation.)

Wenn Sie den Unterstrich likeals Literal verwenden möchten , müssen Sie ihn umgehen:

select * from a where name like '%taz\_manual%.pdf%';

afaik dies ist nur relevant, wenn Sie sich in einem Musterkontext befinden. zB innerhalb einer LIKEAussage. Beim Ersetzen aller _durch -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Beachten Sie das Entweichen im Inneren LIKEund kein Entweichen im Inneren REPLACE. (Ich finde es allerdings seltsam, dass Sie sich nicht in einem Musterkontext innerhalb ersetzen ...)
— Hafenkranich

@Hafenkranich aus dem MySQL-Dokument: "Verwenden Sie die Vergleichsoperatoren LIKE oder NOT LIKE"
— Book Of Zeus

2

Ich hatte ein ähnliches Problem mit Leerzeichen und Bindestrichen beim Abgleichen von Zeichenfolgen mit exakter Übereinstimmung:

SELECT id FROM location WHERE name = 'IND - HQ';

Die obige Abfrage hat keine Datensätze in MySQL zurückgegeben. Ich musste die Leerzeichen und Bindestriche verlassen und LIKEanstelle der exakten Übereinstimmung mit equals (=) Folgendes verwenden:

SELECT id FROM location WHERE name LIKE 'IND_\-_HQ';

Sind Sie sicher, dass dies verwandt ist? Vielleicht gab es keine Ortszeile mit genau diesem Namen ... ???
— Nico Haase

Ja, es gab Zeilen mit location = 'IND - HQ' und die oben genannten haben das Problem
— behoben

Und Sie wissen das, weil Sie die Person, die diese Frage hatte, fünf Jahre vor Ihrer Antwort gefragt haben?
— Nico Haase
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.