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?

AMH
quelle

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
Oleg Dok
quelle
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

Yiping
quelle
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