sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2008 Tom streng vs. plads

varchar s og lighed er tornede i TSQL. LEN funktion siger:

Returnerer antallet af tegn i stedet for antallet af bytes af det givne strengudtryk, ekskluderer efterfølgende blanktegn .

Du skal bruge DATALENGTH for at få en ægte byte antal af de pågældende data. Hvis du har unicode-data, skal du bemærke, at den værdi, du får i denne situation, ikke vil være den samme som længden af ​​teksten.

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

Når det kommer til lighed af udtryk, sammenlignes de to strenge for lighed som denne:

  • Få kortere streng
  • Pad med blanks indtil længden er lig med den længere streng
  • Sammenlign de to

Det er det midterste trin, der forårsager uventede resultater - efter det trin sammenligner du effektivt mellemrum med mellemrum - derfor ses de at være ens.

LIKE opfører sig bedre end = i "blanks" situationen, fordi den ikke udfører blank-padding på det mønster, du forsøgte at matche:

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

Vil give eq mens:

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

Vil give ne

Forsigtig med LIKE dog:den er ikke symmetrisk:den behandler efterstillede mellemrum som signifikant i mønsteret (RHS), men ikke matchudtrykket (LHS). Følgende er taget herfra:

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. mysqli eller dø, skal den dø?

  2. Databaseindeksering i PostgreSQL

  3. Inden for en triggerfunktion, hvordan man får hvilke felter der opdateres

  4. TNSPING OK, men sqlplus giver ORA-12154?