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?

Z.B
quelle

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%';
Buch des Zeus
quelle
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';
NBhat
quelle
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