Câu trả lời ban đầu của tôi cho thấy rằng cờ ANSI_PADDING được đặt thành TẮT có thể là nguyên nhân cho sự khác biệt trong hành vi. Tuy nhiên, điều này là không chính xác; cờ này chỉ có tác dụng trong việc lưu trữ, nhưng không so sánh bình đẳng.
Sự khác biệt bắt nguồn từ việc Microsoft thực hiện tiêu chuẩn SQL . Tiêu chuẩn quy định rằng khi kiểm tra sự bằng nhau, cả hai chuỗi bên trái và bên phải của toán tử đẳng thức phải được đệm để có cùng độ dài . Điều này giải thích các kết quả sau:
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
Toán tử THÍCH không đệm toán hạng của nó. Nó cũng hoạt động khác nhau cho các loại VARCHAR
và NVARCHAR
cột :
-- 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
Hành vi của toán tử THÍCH cho loại ASCII là dành riêng cho SQL Server; đối với loại Unicode, nó tuân thủ ANSI.
MyString+'x' = ltrim(rtrim(MyString))+'x'
như được đề xuất trên blog này