varchar
s и равенството са трънливи в TSQL. LEN
функция казва:
Връща броя на знаците, а не броя на байтовете на дадения низов израз, с изключение на крайните празни места .
Трябва да използвате DATALENGTH
за да получите истински byte
брой на въпросните данни. Ако имате данни в Unicode, имайте предвид, че стойността, която получавате в тази ситуация, няма да е същата като дължината на текста.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Когато става въпрос за равенство на изразите, двата низа се сравняват за равенство по следния начин:
- Вземете по-къс низ
- Подложка с заготовки докато дължината стане равна на тази на по-дългия низ
- Сравнете двете
Това е средната стъпка, която причинява неочаквани резултати - след тази стъпка вие ефективно сравнявате празно пространство с празно пространство - следователно се вижда, че те са равни.
LIKE
се държи по-добре от =
в ситуацията на "празни", защото не изпълнява празно запълване на шаблона, който се опитвахте да съпоставите:
if '' = ' '
print 'eq'
else
print 'ne'
Ще даде eq
докато:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Ще даде ne
Внимавайте с LIKE
въпреки това:не е симетричен:третира крайния празен интервал като значим в шаблона (RHS), но не и израза за съвпадение (LHS). Следното е взето от тук:
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