In MySQL ist es üblich, Sonderzeichen, einschließlich des Backslash(), zu maskieren. , in Abfragen, um Interpretationskonflikte zu vermeiden. Beim Vergleich des Verhaltens des Gleichheitsoperators (=) und des LIKE-Operators in Bezug auf den Backslash tritt jedoch eine merkwürdige Anomalie auf.
Im Fall des Gleichheitsoperators ist kein zusätzlicher Backslash erforderlich, um den Backslash innerhalb des Suchbegriffs zu maskieren. Die folgende Abfrage ruft beispielsweise die Zeile ab, in der die Titelspalte den Wert „test“ enthält.
SELECT * FROM `titles` WHERE title = 'test\';
Der MySQL-Parser interpretiert den Backslash im Suchbegriff automatisch als Literalzeichen, daher der erfolgreiche Abruf.
Im Gegensatz zum Gleichheitsoperator erfordert der LIKE-Operator einen zusätzlichen Backslash, um den Backslash im Suchbegriff zu maskieren. Dies liegt daran, dass der LIKE-Operator einen Mustervergleich durchführt und der Backslash in SQL standardmäßig als Escape-Zeichen fungiert. Somit ruft die folgende Abfrage dieselbe Zeile wie die vorherige ab:
SELECT * FROM `titles` WHERE title LIKE 'test\\';
In dieser Abfrage stellen die doppelten Backslashes sicher, dass der einzelne Backslash im Suchbegriff wörtlich als Backslash-Zeichen interpretiert wird.
Der Grund für dieses Verhalten liegt in der Art und Weise, wie MySQL LIKE-Muster verarbeitet. Der Parser entfernt zunächst die Backslashes aus dem Suchbegriff. Beim anschließenden Mustervergleich werden die Backslashes jedoch wieder entfernt. Dadurch bleibt ein einzelner Backslash übrig, der mit dem Muster abgeglichen werden muss. Um sicherzustellen, dass der Backslash als Literalzeichen behandelt wird, ist der zusätzliche Backslash erforderlich.
MySQL ermöglicht Ihnen die Angabe eines anderen Escape-Zeichens Zeichen für LIKE-Muster mithilfe der ESCAPE-Klausel. Die folgende Abfrage verwendet beispielsweise das Pipe-Zeichen (|) als Escape-Zeichen:
SELECT * FROM `titles` WHERE title LIKE 'test\' ESCAPE '|';
In diesem Beispiel wird der einzelne Backslash im Suchbegriff wörtlich interpretiert, da ihm das angegebene Escape-Zeichen vorangestellt ist .
Das obige ist der detaillierte Inhalt vonWarum benötigt MySQL doppelte Backslashes, um einem Backslash in LIKE-Abfragen zu entkommen, aber nicht in Equals (=)-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!