我最初的答案建议将ANSI_PADDING标志设置为OFF可能是由于行为上的差异。但是,这是不正确的。该标志仅对存储有影响,而对相等比较没有影响。
差异源自Microsoft对SQL标准的实施。该标准指出,在检查相等性时,必须对相等性运算符的左右两个字符串进行填充以使其长度相同。这解释了以下结果:
insert into test_padding (varchar_clmn, nvarchar_clmn) values ('space ', 'nspace ')
go
-- equality for varchar column
select count(*) from test_padding where varchar_clmn = 'space' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' --returns 1
-- equality for nvarchar column
select count(*) from test_padding where nvarchar_clmn = 'nspace' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' --returns 1
LIKE运算符不填充其操作数。对于VARCHAR
和NVARCHAR
列类型,它的行为也不同:
-- likeness for varchar column
select count(*) from test_padding where varchar_clmn like 'space' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 0
-- likeness for nvarchar column
select count(*) from test_padding where nvarchar_clmn like 'nspace' -- returns 0
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 0
对于ASCII类型,LIKE运算符的行为是特定于SQL Server的。对于Unicode类型,它符合ANSI。
MyString+'x' = ltrim(rtrim(MyString))+'x'
的建议在这个博客上