Verhalten von Varchar mit Leerzeichen am Ende


13

Wenn ich einen Varchar mit Leerzeichen verwende, werden die Leerzeichen am Ende ignoriert.

Ex:

declare @X varchar(50)

Dies...

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?

Antworten:


21

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 finden Sie weitere Details zu nachgestellten Leerzeichen und der LIKEKlausel .

ABER wenn Sie sie unterscheiden möchten, können Sie sich dafür entscheiden, die DATALENGTHFunktion anstelle von zu 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

  • Verwenden der DATALENGTH-Funktion, um zwischen Zeichenfolgen zu unterscheiden
  • Um den String in den NVARCHAR-Typ umzuwandeln, ist es möglicherweise besser, diesen Typ als Parameter von SP zu deklarieren

Spektakulärer Beitrag, endlich ein paar gute Infos gefunden
Gaspa79

-2

Sie können Ihrer Bedingung einfach einen Leerraum hinzufügen.

set @X= 'John           \n'

Nachgestellte Leerzeichen in Zeichenfolgenfunktionen


5
\nhat in SQL Server keine Bedeutung. Es wird nicht als neue Zeile interpretiert. Dies ist ohnehin keine Antwort auf die gestellte Frage.
Martin Smith

@MartinSmith, aber es ist in MSDN geschrieben. "Wenn Ihre Zeichenfolge nachgestellte Leerzeichen enthalten muss, sollten Sie am Ende ein Leerzeichen anhängen, damit SQL Server die Zeichenfolge nicht schneidet."
Yiping
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.