คำตอบเริ่มต้นของฉันแนะนำว่าการตั้งค่าสถานะ ANSI_PADDING เป็น OFF อาจเป็นการตำหนิสำหรับความแตกต่างในพฤติกรรม อย่างไรก็ตามสิ่งนี้ไม่ถูกต้อง ธงนี้มีผลต่อการจัดเก็บ แต่ไม่เปรียบเทียบความเท่าเทียมกัน
ความแตกต่างที่เกิดจากการใช้งานไมโครซอฟท์มาตรฐานของ 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
ลักษณะการทำงานของตัวดำเนินการ LIKE สำหรับชนิด ASCII เป็น SQL Server เฉพาะ สำหรับประเภท Unicode เป็นไปตามมาตรฐาน ANSI
MyString+'x' = ltrim(rtrim(MyString))+'x'
ตามที่แนะนำในบล็อกนี้