Leere Zeichenketten: Warum oder wann ist '' gleich ''?


17

Wer kann das erklären?

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

Ausbeuten

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

Die lustige Folge davon ist, dass in

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

Das Update ersetzt zwar die leere Zeichenfolge durch ein Leerzeichen, die where-Klausel bleibt jedoch wahr, und die wiederholte Ausführung der update-Anweisung weist darauf hin

(1 row(s) affected)

Antworten:


22

Hinterlegte Leerzeichen erklärt :

SQL Server befolgt die 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 der Vergleichselemente WHERE und HAVING sowie anderer Transact-SQL-Zeichenfolgenvergleiche 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 nicht auf die gleiche Länge auf, bevor der Vergleich durchgeführt wird. Da der Zweck des LIKE-Prädikats per Definition darin besteht, Mustersuchen zu vereinfachen, anstatt einfache Zeichenfolgengleichheitstests durchzuführen, verstößt dies nicht gegen den bereits 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

Im Folgenden finden Sie weitere Details zu den nachgestellten Leerzeichen und der LIKEKlausel .

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.