Collation برای این منظور بکار برده می شود که بتوانیم اطلاعات رشته ای رو به صورتی کارامد تر ذخیره و بازیابی و سرچ کنیم. این زمانی که شرکت ها تصمیم به پشتیبانی از زبان های غیر انگلیسی گرفتند، شروع شد.

از جایی که زبان انگلیسی با احتساب حروف کوچک در نهایت 52 حرف دارد، مضاف بر علائم کنترلی و نگارشی و اعداد در نهایت 128 کاراکتر قرارداد شد و برای هر کدام کدی اختصاص داده شد.

از اونجایی هم که برای ذخیره 128 نماد نیاز به 7 بیت هست و تعداد بیت ها می باید مضربی از 8 می بود، از 8 بیت یا یک بایت برای ذخیره استفاده کردند.

برای 128 فضای خالی باقی مونده هم از علائمی استفاده کردند که بتوانند به صورت ساده گرافیک و جدول را پیاده کنند و پرینت بگیرند.

در حالت فارسی هم از همون فضای کاراکتر های چاپی استفاده می کردند.

تا این جا مشکلی نبود اما با ورود زبانهای دیگر به کامپیوتر یک بایت اضافی هم در نظر گرفته شد. این بایت در حقیقت نمایانگر زبان مورد استفاده بود.

یعنی مثلا اگر کاراکتر 186 علامت || در زبان استاندارد ASCII بود این بار اگر کد پیج (همون کاراکتر اضافی) روی زبانی غیر از انگلیسی بود این کاراکتر به معنی مثلا آلفا می شد.

این کاراکتر برای زبان استاندارد صفر و برای زبان فارسی 6 در نظر گرفته شد. (254 هم هست)

می تونید برای اطلاعات بیشتر از برنامه CharMap خود ویندوز جریان رو ببینید.(در Run تایپ کنید)

در برنامه نوت پد هم در حالتی که بخواهید در استاندارد جدید (UniCode) متنتون رو ذخیره کنید خواهید دید که حجم جدید به دو برابر + 2 بایت اضافی برای هدر تشخیص افزایش خواهد یافت.

در اس کیو ال هم جریان مشابهی هست.

در حالت استاندارد اسکی برای هر کاراکتر یک بایت در نظر گرفته خواهد شد که انواع داده ای Char, Text, VarChar از همین نوعند.

اگر قرار باشد که حروف فارسی رو ذخیره کنید کدپیج کجا ذخیره می شد؟

دقیقا! اینجاست که کولیشن معنی پیدا می کند.

در حقیقت کولیشن معین می کند که زبان مورد استفاده در فضای اضافی در نظر گرفته شده چی هست.

به همین خاطر هم هست که اطلاعات منتقل شده به دیتابیسی که کولیشن ما رو نداره به صورت عجیب غریب یا علامت سوال در میاد.

اگر بخواهیم در جدولی همزمان از چندین زبان استفاده کنیم دیگه راهی نداریم جز اینکه به جای استفاده از کولیشن از مود یونیکد استفاده کنیم و برای هر کاراکتر از دو بایت استفاده کنیم.

انواع داده ای NChar, NText, NVarChar برای همین منظور در نظر گرفته شده اند.

استفاده از این انواع تا حد امکان باید محدود بشه چون به شدت روی سرعت تاثیر منفی دارند.

در نام گذاری کولیشن های ارائه شده هم معمولا از حروفی استفاده می کنند که بر این منوال هستند:

C = Case

A = Accent

S = Sensitive

I = Insensitive

مثلا کولیشن SQL_Latin1_General_CP1256_CI_AS یعنی Case Insensitive Accent Sensitive.

برای مقاصد ما Persian_100_CI_AI بکار می رود.

نکته آخر هم این که تنظیمات کولیشن در سطح Instance یا پایگاه داده یا جدول و در نهایت فیلد می تواند اعمال شود.

این تنظیمات از سطح بالاتر گرفته شده مگر اینکه به صورت مستقیم بیان شود.