Wenn ich einen Varchar mit Leerzeichen verwende, werden die Leerzeichen am Ende ignoriert.
ex:
declare @X varchar(50)
Diese...
set @X= 'John'
...ist das gleiche wie...
set @X= 'John '
Es betrachtet diese als gleich. Wie kann ich das System veranlassen, diese als unterschiedlich zu erkennen?
Alles entspricht nur dem ANSI-Standard:
Nachgestellte Leerzeichen erklärt :
SQL Server folgt der ANSI/ISO SQL-92-Spezifikation (Abschnitt 8.2, Allgemeine Regeln Nr. 3) zum Vergleichen von Zeichenfolgen mit Leerzeichen. Der ANSI-Standard erfordert ein Auffüllen der in Vergleichen verwendeten Zeichenfolgen, damit ihre Längen übereinstimmen, bevor sie verglichen werden. Das Auffüllen wirkt sich direkt auf die Semantik von WHERE- und HAVING-Klauselprädikaten und anderen Transact-SQL-Zeichenfolgenvergleichen aus. Beispielsweise betrachtet Transact-SQL die Zeichenfolgen 'abc' und 'abc' für die meisten Vergleichsoperationen als äquivalent.
Die einzige Ausnahme von dieser Regel ist das LIKE-Prädikat. Wenn die rechte Seite eines LIKE-Prädikatausdrucks einen Wert mit einem nachgestellten Leerzeichen enthält, füllt SQL Server die beiden Werte vor dem Vergleich nicht auf dieselbe Länge auf. Da der Zweck des LIKE-Prädikats per Definition darin besteht, die Mustersuche zu vereinfachen, anstatt einfache Zeichenfolgengleichheitstests durchzuführen, verstößt dies nicht gegen den zuvor erwähnten Abschnitt der ANSI SQL-92-Spezifikation.
Hier ist ein bekanntes Beispiel für alle oben genannten Fälle:
DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)
SET @a = '1'
SET @b = '1 ' --with trailing blank
SELECT 1
WHERE
@a = @b
AND @a NOT LIKE @b
AND @b LIKE @a
Hier einige Details zu nachgestellte Leerzeichen und die Klausel LIKE
.
[~ # ~] aber [~ # ~] Wenn Sie sie unterscheiden möchten, können Sie die Funktion DATALENGTH
anstelle von verwenden LEN
, weil
SELECT 1 WHERE LEN('John ') = LEN('John')
wird dir 1 statt setzen
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
Die Lösung ist