۱۳۸۸/۰۵/۰۷

مقايسه حساس به حروف كوچك و بزرگ در SQL Server


چندين روش براي انجام مقايسه حساس به حروف كوچك و بزرگ (case sensitive) در SQL Server وجود دارد كه در ادامه آن‌ها را مرور خواهيم كرد:

ابتدا جدول موقتي زير را جهت آزمايشات بعدي در نظر بگيريد

CREATE TABLE #tblTest
(
f1 NVARCHAR(50)
)

INSERT INTO #tblTest (f1) VALUES('Test1')
INSERT INTO #tblTest (f1) VALUES('TEST1')

الف) استفاده از collation صحيح
عموما هنگام نصب اس كيوال سرور از collation غيرحساس به كوچكي و بزرگي حروف استفاده مي‌شود و اين مورد سبب مي‌شود كه پيش فرض ايجاد ديتابيس‌ها نيز به همين صورت باشد (هر چند كاملا قابل كنترل و تنظيم است). به صورت پويا مي‌توان اين collation را در كوئري‌ها نيز اعمال نمود. براي مثال:

SELECT f1 FROM #tblTest WHERE f1 COLLATE SQL_Latin1_General_CP1_CS_AS = 'Test1'
در اين مثال اگر از collation حساس به كوچكي و بزرگي حروف استفاده نمي‌شد، خروجي هر دو ركورد ثبت شده مي‌بود.

ب) استفاده از تابع BINARY_CHECKSUM اس كيوال سرور (نوعي الگوريتم ويژه، شبيه به امضاي ديجيتال و هش كردن اطلاعات است)

SELECT f1 FROM #tblTest WHERE BINARY_CHECKSUM(f1) = BINARY_CHECKSUM('Test1')
و يا استفاده از امكانات هش كردن اطلاعات در اس كيوال سرور: (امضاي ديجيتال دو رشته با هم مقايسه مي‌شوند)

SELECT f1 FROM #tblTest WHERE hashbytes('md5',f1) = hashbytes('md5',N'Test1')
ج) مقايسه در حالت بايناري

SELECT f1 FROM #tblTest WHERE convert(varbinary(50),f1) = convert(varbinary(50),N'Test1')