Design

انواع داده در Microsoft SQL Server – بخش دوم

بحث نوع داده در SQL Server به مانند تمامی پایگاه های داده و زبان های برنامه نویسی بحثی مهم و کلیدی است. درSQL Server تمامی فیلدها، متغیرها و پارامترها دارای یک نوع داده می باشند.

اما چرا نوع داده مهم است؟ نوع داده مشخص می کند که هر فیلد، متغیر یا پارامتری، چه مقادیری را می تواند در خود نگهداری کند، چه بازه ای از آن نوع داده را با چه دقتی پوشش می دهد و چه میزان فضا را به خود اختصاص می دهد.

در مقاله قبلی به بررسی انواع داده عددی پرداختیم. در ادامه انواع داده کاراکتری را بررسی خواهیم کرد:

قسمت دوم: انواع داده کاراکتری

انواع داده کاراکتری در Microsoft SQL Server به دو دسته اصلی تقسیم می شوند:

  1. رشته های کاراکتری
    1. char
    1. varchar
    1. text
  2. رشته های کاراکتری یونیکد
    1. nchar
    1. nvarchar
    1. ntext

صفحه کد یا Code Page:

همانطور که قبلا گفته ایم، تمامی داده ها در یک سیستم کامپیوتری بایستی در قالب بیت و بایت ذخیره شوند. این به معنای آن است که تمامی اطلاعات به صورت صفر و یک ذخیره می شوند. تبدیل کردن اعداد به مجموعه ای از صفر ها و یک ها با تغییر مبنای آن ها از دهدی به دودویی صورت می گیرد. فرایند این تبدیل، کار سختی نبوده و با یک عملیات ریاضی قابل پیاده سازی می باشد. اما سیستم های کامپیوتری چگونه کاراکترهای نوشتاری را به صفر و یک تبدیل می کنند؟

برای این منظور سیستم های کامپیوتری از جدولی به نام Code Page استفاده می کنند که وظیفه آن نگاشت یک کاراکتر به یک عدد می باشد.

اگر هر کاراکتر از یک بایت فضا استفاده کند. عددی که به کاراکتر فوق می دهیم در بازه 0 تا 255 قرار می گیرد. به معنای دیگر، با پیش فرض فوق ما می توانیم برای 256 کاراکتر مختلف، عددهای متمایز تعریف کنیم.

تصویر زیر نمونه ای از یک Code Page است که وظیفه آن نگاشت کاراکترهای ASCII (کد استاندارد آمریکایی برای تبادل اطلاعات) می باشد.

صفحه کد ASCII
صفحه کد ASCII

شرکت های نرم افزاری برای محصولات مختلف از جمله سیستم های عامل و پایگاه های داده؛ به تعریف Code Page های گوناگونی پرداخته اند تا بتوانند کاراکتر های زبان های مختلف را پوشش بدهند. به طور مثال Windows-1256 نام Code Page شرکت مایکروسافت برای پوشش کاراکترهای نوشتار عربی (عربی، فارسی و اردو) می باشد.

  • تعداد کاراکتر زبان های آسیای شرقی (مانند ژاپنی، کره ای و چینی)، بیشتر از 256 می باشد. بنابراین Code Page های یک بایتی جوابگوی این زبان ها نمی باشند. برای پوشش زبان های فوق از Code Page های دو بایتی استفاده می شود. یعنی برای هر کاراکتر 2 بایت فضا در نظر گرفته می شود. این Code Page ها 65536 کاراکتر را پوشش می دهند.

(2B = 16b پس تعداد کاراکتر ها برابر است با: 2^16 = 65536)

  • از نسخه SQL 2019 به بعد، امکان استفاده از انکدینک UTF-8 با Code Page شماره 65001 نیز به Microsoft SQL Server اضافه شده است. UTF-8 یک انکدینگ برای نگاشت کاراکترها است که سایز کاراکتر ها در آن متغیر است و هر کاراکتر بنا به نوع آن از 1 تا 4 بایت فضا می گیرد.
    1. 128 کاراکتر ابتدایی ASCII، یک بایت.
    2. 1920 کاراکتر بعدی (شامل زبان های عربی، عبری، یونانی و …) دو بایت.
    3. اکثر کاراکتر های ژاپنی، کره ای و چینی؛ سه بایت.
    4. نماد های ریاضی، ایموجی ها و قسمتی کاراکتر های ژاپنی، کره ای و چینی؛ چهار بایت.

Collation:

در SQL Server، علاوه بر تعیین Code Page، از یک سری قوانین نیز هنگام استفاده از کاراکتر ها استفاده می کنیم. به مجموع این قوانین و Code Page ها Collation گفته می شود.

به طور کلی، دو نوع Collation در SQL Server وجود دارد. Collation های ویندوزی و SQL ای.

  • تمامی Collation های نوع SQL ای در ابتدای نام خود واژه SQL_ را دارا می باشند.
مثالتوضیحعنوانقانون
A=aبه حروف بزرگ و کوچک حساس نیستCase InsensitiveCI
A<>aبه حروف بزرگ و کوچک حساس استCase SensitiveCS
a=àبه اِعراب حساس نیستAccent InsensitiveAI
A<>àبه اِعراب حساس استAccent SensitiveAS
 پشتیبانی از انکدینگ UTF-8Enabled UTF-8UTF-8
 پشتیبانی از کاراکترهای تکمیلی در انکدینگ UTF-8Supplementary CharactersSC
قوانین مهم در Collation

از روی نام Collation می توانیم به قوانین آن پی ببریم:

توضیحCollation
استفاده از Code Page مخصوص SQL، شماره 1256 حساس به حروف بزرگ و کوچک حساس نسبت اِعرابSQL_Latin_1256_CS_AC
استفاده از Code Page زبان فارسی ویندوز غیر حساس به حروف بزرگ و کوچک غیر حساس نسبت اِعراب پشتیبانی از انکدینگ UTF-8 پشتیبانی از کاراکترهای تکمیلی انکدینگ UTF-8Persian_100_CI_AI_SC_UTF8
مثال Collation

در این لینک می توانید لیست Collation های تعریف شده در SQL Server را مشاهده کنید.

نوع داده char(n و varchar(n):

انواع داده کاراکتری char (اندازه ثابت) یا varchar (اندازه متغیر)، جهت ذخیره سازی اطلاعات از Collation ها استفاده می کنند. پارامتر n مشخص می کند که اندازه رشته، حداکثر چند بایت است. اگر از Collation های یک بایتی استفاده شود، تعداد کاراکتر با تعداد بایت برابر خواهد بود، اما در صورت استفاده از Collation های جند بایتی، تعداد کاراکتر ها از تعداد بایت ها کمتر می شود.

مقدار n می تواند عددی بین 1 تا 8000 یا مقدار max باشد. در صورت استفاده از max، اندازه رشته می تواند تا 2GB باشد. اگر n را مشخص نکنیم، مقدار پیش فرض آن 1 خواهد بود.

  • هنگام استفاده از عملگر های تبدیل نوع داده (CAST یا CONVERT) اگر n، مشخص نشود، مقدار پیش فرض آن 30 خواهد بود.

اشیایی که از این نوع داده استفاده کنند، به طور پیش فرض از Collation پایگاه داده ارث بری می کنند. البته می توانیم هنگام تعریف این اشیا از دستور COLLATE و نام Collation برای تغییر این تنظیمات پیش فرض استفاده کنیم.

تفاوت های char و varchar چیست؟

در نوع داده char، فضای ذخیره سازی ثابت است و تغییری نمی کند. فرض کنید که در یک جدول ستون name با نوع داده char(16) داشته باشیم. اگر نام ذخیره شده، واژه ALI با سه کاراکتر باشد چه اتفاقی می افتد؟

ILA
فضای هدر رفته در نوع داده char

سه کاراکتر ذخیره شده، 3 بایت فضا به خود می گیرد، اما 13 بایت فضای باقیمانده آزاد نمی شود. در واقع SQL Server در این حالت نسبت به فضا حریصانه رفتار می کند. پس فارغ از اینکه رشته ذخیره شده چند کاراکتر داشته باشد، در هر صورت هر رکورد 16 بایت فضا به خود اختصاص می دهد. در این حالت امکان هدر رفتن فضا بالا می رود.

اما در نوع داده varchar، فضای ذخیره سازی متغیر بوده و بر اساس تعداد کاراکتر های وارده مشخص می شود. در این حالت فضای استفاده نشده آزاد می شود.

  • همچنین SQL Server برای مدیریت داینامیک بودن فضا از2 بایت اضافی بهره می گیرد. در اصل فضای تخصیص داده شده در این نوع داده n + 2 بایت می باشد.

نوع داده nchar(n) و nvarchar(n):

اگر داده های شما چند زبانی باشند، بنابراین نیاز است که از Collation ای استفاده شود که تمامی کاراکترهای موجود در تمامی زبان ها را پوشش دهد. تا قبل از SQL 2019 که امکان استفاده از UTF-8 وجود نداشت، چنین Collation ای هم وجود نداشت.

انواع داده nchar و nvarchar از استاندارد یونیکد جهت نگاشت تمامی کاراکترهای موجود استفاده می کنند.

پارامتر n مشخص کننده حداکثر اندازه رشته در واحد دو-بایت است. اگر از 65536 کاراکتر ابتدایی این استاندارد استفاده شود، هر کاراکتر 2 بایت فضا به خود اختصاص می دهد. کاراکتر های بعدی تعداد بایت بیشتری استفاده می کنند.

 مقدار n می تواند عددی بین 1 تا 4000 یا مقدار max باشد. در صورت استفاده از max، اندازه رشته می تواند تا 2GB باشد. اگر n را مشخص نکنیم، مقدار پیش فرض آن 1 خواهد بود.

در جدول زیر به طور خلاصه ویژگی های انواع داده کاراکتری را مقایسه می کنیم:

اندازه (بایت)Collationاندازهn نوع داده
nوابستهثابت0 – 8000char
n + 2وابستهمتغیر0 – 8000varchar
2*nمستقلثابت0 – 4000nchar
2*n + 2مستقلمتغیر0 – 4000nvarchar
انواع داده کاراکتری

از کدام نوع داده کاراکتری استفاده کنیم؟

پارامترهای مختلفی در تعیین بهترین نوع داده کاراکتری، نقش دارند. اما مهمترین آن ها به شرح زیر می باشد:

  • اگر Collation ای وجود دارد که تمامی کاراکتر های شما را پشتیبانی می کند، از نوع داده char یا varchar استفاده کنید.
    • اگر کاراکتر های شما فراتر از یک Collation است و از ورژن SQL 2019 به بعد استفاده می کنید، از نوع داده char یا varchar به همراه Collation هایی استفاده کنید که از انکدینگ UTF-8 پشتیبانی می کنند.
    • در غیر این صورت از نوع داده nchar یا nvarchar استفاده کنید.
  • اگر اندازه رشته های وارد شده یکسان است، از انواع داده char یا nchar استفاده کنید.
    • در غیر این صورت از انواع داده varchar یا nvarchar استفاده کنید.
  • اگر داده شما در طول زمان تغییرات زیادی دارد، از انواع داده char یا nchar استفاده کنید.
    • در غیر این صورت از انواع داده varchar یا nvarchar استفاده کنید.

نوع داده text و ntext:

طبق اعلام شرکت Microsoft، این دو نوع داده در نسخه های آتی SQL Server، پشتیبانی نخواهند شد و به جای آن ها از varchar(max) یا nvarchar(max) استفاده کنید.

برچسب ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا
بستن
بستن