Jawaban awal saya menyarankan bahwa bendera ANSI_PADDING yang disetel ke MATI mungkin merupakan penyebab perbedaan perilaku. Namun, ini tidak benar; bendera ini hanya memiliki efek pada penyimpanan, tetapi bukan perbandingan kesetaraan.
Perbedaannya berasal dari penerapan standar SQL oleh Microsoft . Standar menyatakan bahwa ketika memeriksa kesetaraan, kedua string kiri dan kanan operator kesetaraan harus diisi agar memiliki panjang yang sama . Ini menjelaskan hasil-hasil berikut:
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
Operator LIKE tidak memasang operan. Itu juga berperilaku berbeda untuk VARCHARdan NVARCHARjenis kolom :
-- 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
Perilaku operator LIKE untuk tipe ASCII adalah khusus SQL Server; untuk jenis Unicode itu adalah ANSI-compliant.
MyString+'x' = ltrim(rtrim(MyString))+'x'seperti yang disarankan di blog ini