varchar و nvarchar

در مواجه با این دو data type پر استفاده SQL Server، اولین سوالی که براتون پیش میاد اینه که کدوم رو باید استفاده کنم؟ برای پاسخ به این سوال باید تفاوت های این دو data type رو بدونیم. و این که استفاده از هر کدوم چه مزیتی برای مدل ما میتونه داشته باشه؟ آیا ارتباطی با تفاوت های زبانی وجود داره؟ مثلا اگه از زبان فارسی در دیتابیس استفاده میشه آیا الزاما باید از nvarchar استفاده کرد؟

Character Encoding

همونطور که میدونیم یا لازمه بدونیم! کامپیوترها زبانی که ما صحبت می کنیم رو به این صورت که ما متوجه میشویم متوجه نمیشوند! که برای ارتباط با کامپیوترها، کاراکترهای متنی و عددی و غیره لازمه به 0 و 1 و به صورت باینری تبدیل شوند. character encoding روش یا فرآیندیه که این تبدیل رو انجام میده. یعنی مقادیر عددی یا الفبای زبان های مختلف و هر نوع کاراکتر دیگه رو به شکل های منحصر به فردی (unique) تبدیل میکنه و در نهایت به مقادیر باینری که امکان ذخیره سازی بر روی قطعات Storage رو داشته باشند.

اما استاندارد های (character set) متفاوتی برای این تبدیل ها وجود داره که از ابتدایی ترین اون ها و البته رایج ترین این مجموعه های کاراکتری، ASCII هستش که شامل مقادیر عددی و حروف الفبای انگلیسی و کاراکترهای رایج دیگه مثل ! و ؟ و @ و غیره هست. این charset شامل 128 کاراکتر هستش که از 0 تا 127 شماره گذاری شدند. که در SQL Server رایج ترین code page مورد استفاده 1252 هستش.

code page: به معنی مقادیر عددی unique هست که برای تبدیل کاراکترها استفاده میشه که رایج ترین استاندارد مورد استفاده 437 و 1252 هست.

اما با وجود این حجم از کاراکترها و زبان ها که به طور مثال زبان چینی که حدود 5000 کاراکتر رو شامل میشه، نیاز به استفاده از charset های جامع تر از مثلا ASCII ها بود. که همین موضوع باعث شد در سال 1991 سازمانی غیر انتفاعی با نام Unicode Consortium بنیان گذاشته بشه که مسئولیت نگه داری و تنظیم این مقادیر و encoding scheme های مرتبط رو عهده دار بشه حتی ایموجی ها 😁!

Unicode: مخفف Universal Character Encoding و البته در برخی منابع Universally Coded Character Set ذکر شده.

از جمله معروف ترین این encoding schemes ها که Unicode Consortium مسئولیت نگه داری و تنظیم اون رو بر عهده داشته UTF-8 هست. که UTF مخفف Unicode Transformation Format و 8 به معنای اینه که هر byte یا 8 bit نشان دهنده یه کارکتر هست. این charset شامل 1,112,064 character point هستش.

اما این خلاصه ای از معرفی مفاهیم Encoding و Unicode بود تا بتونیم وارد بحث اصلی بشیم.

varchar

همونطور که از اسمش مشخصه این data type به صورت متغیر مقادیر رو ذخیره سازی میکنه. یعنی فضای ثابتی رو برخلاف char اشغال نمیکنه و با توجه به طول رشته فضا در نظر میگیره. varchar، امکان ذخیره سازی اعداد، کاراکترهای متنی و special characters ها رو داره. از نسخه 2008 به بعد، SQL Server، امکان ذخیره سازی تا ماکزیمم 8000 کاراکتر (maximum length) رو در این data type داره. البته با استفاده از max در قسمت طول کاراکتر امکان ذخیره سازی تا 2GB داده وجود داره ولی نوع ذخیره سازی به صورت LOB خواهد بود. varchar فضایی معادل 1 byte برای هر کاراکتر اشغال میکنه و البته به علاوه 2 byte برای اطلاعات طول رشته. در صورتی که طول رشته وارد نشه، داده ها truncate خواهند شد و به صورت پیش فرض فقط کاراکتر اول ذخیره میشه. از نسخه 2019 SQL Server قابلیتی به این data type اضافه شده که امکان پشتیبانی از کاراکترهای UTF-8 در صورت فعال بودن collation های از نوع UTF-8 در اون وجود داره. که این قابلیت جدید امکان ذخیره سازی مقادیر Unicode رو میده که مزیت اصلی اون کم کردن مشکلات و دردسرهای مربوط به convert های داده هاست. و البته استفاده کمتر از فضای ذخیره سازی که برای کاراکترهای Unicode نیز در این حالت برابر 1byte خواهد بودو باعث بهبود عملکرد ذخیره سازی میشه.

nvarchar

اما از جمله تفاوت هایی که nvarchar در مقابل varchar داره طول ماکزیمم 4000 کاراکتر برای رشته هست. مورد دیگه ذخیره سازی دو برابری nvarchar هستش که هر کاراکتر در nvarchar معادل 2byte فضا اشغال میکنه. همچنین مورد استفاده nvarchar برای کاراکترهای Unicode هست که varchar اون ها رو شامل نمیشه، حداقل در نسخه های قبل از 2019. از نسخه SQL Server 2012 امکان ذخیره سازی UTF-16 در این data type فراهم شده.

اما چه زمان از nvarchar استفاده کنیم؟

این سوال به دو عامل بستگی داره اولی collation و دومی نسخه SQL Server مورد استفاده.

  1. زمانی از nvarchar استفاده می کنیم که collation مورد استفاده از کاراکترهایی که قراره ذخیره سازی شوند، پشتیبانی نمیکنه. مثلا چندین زبان مختلف داره استفاده میشه یا کاراکترهایی مثل ایموجی یا notation های خاصی که در collation تنظیم شده پشتیبانی نمیشه
  2. اما اگر از نسخه SQL Server 2019 به بعد استفاده می کنیم، با تنظیم collation مناسب از نوع utf-8 امکان استفاده از varchar برای کاراکترهای Unicode وجود خواهد داشت. در غیر این صورت یعنی اگر از نسخه های قدیمی تر از 2019 استفاده می کنیم nvarchar چاره کار خواهد بود. البته با در نظر گرفتن مورد اول!

نکته لازم به توضیحه که در varchar مکانیزم ذخیره سازی 8 بیتیه (8bit) که که مشابه و قابلیت سازگاری (combability) با ASCII رو داره. این سیستم 8 بیتی البته که منابع مصرفی کمتری رو  نسبت به UTF-16 استفاده می کنه.

برای فهمیدن collation هر دیتابیس میتونید از script زیر استفاده کنید:

برای پیدا کردن و جستجو در collation ها هم از script زیر:

 

 

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

نشانی ایمیل شما منتشر نخواهد شد.

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.

فهرست