Ich bin heute auf ein interessantes Verhalten in SQL Server gestoßen (beobachtet in den Jahren 2005 und 2012), von dem ich gehofft hatte, dass es jemand erklären könnte.
Bei einer Abfrage, die einen Vergleich mit =
einem NVARCHAR-Feld durchführte, wurde das Leerzeichen in der Zeichenfolge ignoriert (oder der Wert vor dem Vergleich automatisch abgeschnitten), bei derselben Abfrage mit dem like
Operator wurde das Leerzeichen jedoch nicht ignoriert. Die verwendete Kollatierung ist Latin1_General_CI_AS im Jahr 2012.
Betrachten Sie diese SQL-Geige: http://sqlfiddle.com/#!6/72262/4
Beachten Sie, dass der like
Operator kein Ergebnis für die nachfolgende Leerzeichenfolge zurückgibt, der =
Operator jedoch. Warum ist das?
Bonuspunkte: Ich kann dies nicht auf ein VARCHAR-Feld replizieren. Ich hätte gedacht, dass ein Leerzeichen in beiden Datentypen auf die gleiche Weise behandelt wird. Stimmt das?
MyString+'x' = ltrim(rtrim(MyString))+'x'
wie in diesem Blog vorgeschlagenAntworten:
Meine erste Antwort deutete darauf hin, dass das auf OFF gesetzte ANSI_PADDING-Flag möglicherweise die Ursache für den Unterschied im Verhalten ist. Dies ist jedoch falsch. Dieses Flag wirkt sich nur auf die Speicherung aus, nicht jedoch auf den Gleichheitsvergleich.
Der Unterschied ergibt sich aus der Implementierung des SQL-Standards durch Microsoft . Der Standard besagt, dass bei der Prüfung auf Gleichheit beide Zeichenfolgen links und rechts vom Gleichheitsoperator aufgefüllt werden müssen, um dieselbe Länge zu haben . Dies erklärt die folgenden Ergebnisse:
Der LIKE-Operator füllt seine Operanden nicht auf. Es verhält sich auch anders für
VARCHAR
undNVARCHAR
Spaltentypen :Das Verhalten des LIKE-Operators für den ASCII-Typ ist SQL Server-spezifisch. Für den Unicode-Typ ist es ANSI-kompatibel.
quelle
SQL wurde in einer Ära geboren, in der die meisten Datenverarbeitungssprachen feste Längen für jedes Feld / jede Variable verwendeten. Das automatische Auffüllen von Textfeldern mit zusätzlichen Leerzeichen war ebenfalls Teil dieses Bildes. Um diesem Verhalten Rechnung zu tragen, wurde der ursprüngliche SQL-CHAR-Typ explizit für den Operator '=' definiert, um nachgestellte Leerzeichen zu ignorieren. (Wenn Sie das seltsam finden, zeigen Sie mir einen überzeugenden Fall, in dem nachgestellte Leerzeichen, die an einen Text angehängt sind, eine echte geschäftliche Bedeutung haben .)
SQL CHAR-Typen haben sich seitdem in alle Richtungen entwickelt, aber es ist nicht unvorstellbar, dass bestimmte modernere Datentypen noch einige Merkmale von ihren historischen Vorgängern geerbt haben.
quelle
In der Dokumentation zu LIKE (Transact-SQL) schreibt Microsoft (Hervorhebung von mir):
quelle