sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008 Tom sträng mot utrymme

varchar s och jämlikhet är svåra i TSQL. LEN funktionen säger:

Returnerar antalet tecken, snarare än antalet byte, för det givna stränguttrycket, exklusive efterföljande blanksteg .

Du måste använda DATALENGTH för att få en sann byte antalet uppgifter i fråga. Om du har unicode-data, notera att värdet du får i den här situationen inte kommer att vara detsamma som längden på texten.

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

När det gäller likhet mellan uttryck jämförs de två strängarna för likhet så här:

  • Få kortare sträng
  • Pad med ämnen tills längden är lika med den längre strängen
  • Jämför de två

Det är mittsteget som orsakar oväntade resultat – efter det steget jämför du effektivt blanksteg med blanksteg – därför ses de vara lika.

LIKE beter sig bättre än = i "blanks" situationen eftersom det inte utför blank-padding på mönstret du försökte matcha:

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

Ger eq medan:

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

Kommer att ge ne

Var försiktig med LIKE dock:den är inte symmetrisk:den behandlar efterföljande blanksteg som signifikant i mönstret (RHS) men inte matchningsuttrycket (LHS). Följande är hämtat härifrån:

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


  1. Vackra block av pannplåt

  2. Hur infogar man en post och returnerar det nyskapade ID:t med ett enda SqlCommand?

  3. Kan jag använda flera markörer på en anslutning med pyodbc och MS SQL Server?

  4. Konfigurera e-postmeddelanden i databasen i MS SQL Server