Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008 Leerzeichenfolge vs. Leerzeichen

varchar s und Gleichheit sind in TSQL heikel. Die LEN Funktion sagt:

Gibt die Anzahl der Zeichen anstelle der Anzahl der Bytes des angegebenen Zeichenfolgenausdrucks zurück, ohne nachgestellte Leerzeichen .

Sie müssen DATALENGTH verwenden um ein echtes byte zu erhalten Anzahl der betreffenden Daten. Wenn Sie Unicode-Daten haben, beachten Sie, dass der Wert, den Sie in dieser Situation erhalten, nicht der Länge des Textes entspricht.

print(DATALENGTH(' ')) --1
print(LEN(' '))        --0

Wenn es um die Gleichheit von Ausdrücken geht, werden die beiden Zeichenfolgen wie folgt auf Gleichheit verglichen:

  • Kürzere Zeichenfolge erhalten
  • Auffüllen mit Leerzeichen bis die Länge der längeren Zeichenfolge entspricht
  • Vergleichen Sie die beiden

Es ist der mittlere Schritt, der zu unerwarteten Ergebnissen führt – nach diesem Schritt vergleicht man effektiv Leerzeichen mit Leerzeichen – daher werden sie als gleich angesehen.

LIKE verhält sich besser als = in der "Leerzeichen"-Situation, weil es kein Leerzeichen auf dem Muster ausführt, das Sie zu finden versuchten:

if '' = ' '
print 'eq'
else
print 'ne'

Wird eq geben während:

if '' LIKE ' '
print 'eq'
else
print 'ne'

Wird ne geben

Vorsicht mit LIKE obwohl:es ist nicht symmetrisch:Es behandelt nachgestellte Leerzeichen als signifikant im Muster (RHS), aber nicht im Übereinstimmungsausdruck (LHS). Folgendes ist hier entnommen:

declare @Space nvarchar(10)
declare @Space2 nvarchar(10)

set @Space = ''
set @Space2 = ' '

if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'

if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'

@Space Not Like @Space2
@Space2 Like @Space