# پایگاه‌های داده > SQL Server > T-SQL > تحلیل و طراحی بانک اطلاعات >  مبانی اس کیو ال - Collation چیست؟

## یوسف زالی

سلام.
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 یا پایگاه داده یا جدول و در نهایت فیلد می تونه اعمال بشه.

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

فهرست

----------


## مهدی هادیان2

با سلام
یه سوالی از خدمتتون داشتم و اون اینکه آیا بعد از ایجاد پایگاه داده هم می توان کالکشن اون رو عوض کرد
با تشکر فراوان

----------


## یوسف زالی

سلام.
با این دستور:
ALTER DATABASE testDB
COLLATE French_CI_AI

----------


## baktash.n81@gmail.com

سلام 
 این نکته رو اضافه کنم که می تونید در زمان اجرا هم با استفاده از دستور Collate اطلاعات رو بر اساس Collation مورد نظر بخونید ... مثلا اگه بخواهید یه View از دو جدول با دوتا collation متفاوت داشته باشید ... خطایی رو دریافت می کند به شکل زیر

Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.

که با استفاده از Collate می تونید مشکلتون رو حل  کنید ...

این هم اطلاعات مربوط به Collation ها ...

SELECT*
FROMfn_helpcollations()

----------


## zari.attari

> سلام.
> با این دستور:
> ALTER DATABASE testDB
> COLLATE French_CI_AI


من با این دستور می خواستم collate دیتابیس pubs رو عوض کنم، اما error داد؟

----------


## zari.attari

اینم خطاش ؟؟؟

----------


## مهدی هادیان2

بسم الله الرحمن الرحیم
با سلام



> اگر بخواهیم در جدولی همزمان از چندین زبان استفاده کنیم دیگه راهی نداریم  جز اینکه به جای استفاده از کولیشن از مود یونیکد استفاده کنیم و برای هر  کاراکتر از دو بایت استفاده کنیم.
> انواع داده ای NChar, NText, NVarChar برای همین منظور در نظر گرفته شده اند.


یه سوال؟
یکی از دوستان چند وقت پیش در انجمن مشکلی مطرح کرده بود. با این مضمون که Collation رو فارسی قرار داده و برای گزارش گیری که با کریستال انجام داده بود به مشکل برخورده بود.
چند وقت پیش هم بنده از یکی از اساتید پرسیدم ایشون گفتند ما Collation رو فارسی میکنیم ولی برای ذخیره یونیکد از همون nvarchar استفاده میکنیم.
از دوستانی که قبلا این موضوع رو در پروژه واقعی امتحان کردند خواهش میکنم تجربیاتشون رو در این زمینه در اختیار ما قرار دهند که مطمئن بشیم اگه برای یونیکد از char استفاده کنیم در ادامه پروژه مسئله ای پیش نمیاد.
با سپاس فراوان

----------


## CaspiBoy

با سلام، 
پرسش من اینه که حساس بودن یا نبودن، کدام یک؟ I = Insensitive
Insensitive بودن یک کولیشن بهتر است یا نبودن آن؟
لطفا مقداری توضیح دهید.

----------


## SayeyeZohor

دمت گرم  واقعاً محشري 
من كه نتونستم به يك تشكر خشك و خالي و كلبك روي اين باتون     بي مزه بسنده كنم

تفاوت بین CHAR و NCHAR در MySQL

CHAR و NCHAR هر دو دارای طول رشته ای ثابت در داده ها دارند. اما تفاوت آنها در چیست؟

CHAR نام کامل CHARACTER یا کاراکتر است.


NCHAR نام کامل NATIONAL CHARACTER یا کاراکتر ملی است.


به طور پیشفرض CHAR از مجموعه کاراکتر های اسکی استفاده میکند و هر یک کاراکتر به میزان 1 بایت ذخیره میشود.


NCHAR از مجموعه کاراکتر های یونیکد استفاده میکند. این نوع ذخیره سازی با فرمت UTF8 انجام میشود و هر یک کاراکتر میتواند 1 بایت تا 4 بایت را اشغال کند.


هر ستون در CHAR و NCHAR با طول ثابت در واحد کاراکتر تعریف شده اند.


برای ایجاد جدول از مثال های مشابه با NCHAR زیر میتوانید استفاده کنید:




CREATE TABLE tableName(columnName NCHAR(80));

CREATE TABLE tableName(columnName NATIONAL CHAR(80));

CREATE TABLE tableName(columnName NATIONAL CHARACTER(80));

CREATE TABLE tableName(columnName CHAR(80) CHARACTER SET utf8);

CREATE TABLE tableName(columnName CHARACTER(80) CHARACTER SET utf8);


ما این کار را میتوانیم برای طراحی بانک های اطلاعاتی فارسی انجام دهیم


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


منبع: www.Vvolf.net






تفاوت بین نوع Char و Varchar:

char دارای طول ثابت است. مثلا وقتی طول یک نوع char رو 255 تعیین کنید اگر طول مقدار تعیین شده فرضا 200 باشد 55 تای بقیه با Space پر میشه ولی در varchar به این صورت نیست.

----------

