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.