تفاوت AL32UTF8 و AR8MSWIN1256 و نقش NATIONAL CHARACTER SET در طول برخی از TYPEها

امروز داشتم از محیط عملیاتی data pump  تهیه می کردم که روی محیط تستی جدیدی برگردونم با اینکه کارکترست هر دو طرف AR8MSWIN1256 بود، در زمان IMPORT با خطای زیر مواجه میشدم. اگر برای شما هم این مطلب جالب شده، این پست رو بخونید.

 ORA-00910: specified length too long for its datatype 

اول از دوست خوبم سید عظیم موسوی نصب برای کمک در حل این مشکل تشکر میکنم.

قبل از اینکه وارد مشکل بشیم در مورد کارکترست های رایجی که فارسی رو پشتیبانی می کنند، کمی بحث کنیم:

  • AL32UTF8: این characterset تمام کاراکترهای Unicode را پشتیبانی می‌کنه، بنابراین تمامی کاراکترهای فارسی (حروف، اعداد و علائم) را نیز شامل می‌شه. این characterset برای سیستم‌هایی که نیاز به پشتیبانی از چندین زبان دارن، خیلی خوبه.
  • AR8MSWIN1256: این characterset تنها کاراکترهای عربی و فارسی را به همراه برخی کاراکترهای لاتین پشتیبانی می‌کنه. اگر پایگاه‌داده شما تنها شامل داده‌های فارسی و عربی هست، ممکن است این characterset کافی باشه
  • AL32UTF8: به دلیل چندبایتی بودن، داده‌های متنی در این characterset ممکن است فضای بیشتری نسبت به AR8MSWIN1256 اشغال کنند. هر کاراکتر فارسی در AL32UTF8 بین 2 تا 3 بایت فضا می‌گیره.
  • AR8MSWIN1256: به دلیل تک‌بایتی بودن، داده‌های متنی در این characterset فضای کمتری نسبت به AL32UTF8 اشغال می‌کنند. هر کاراکتر فارسی در این characterset تنها یک بایت فضا می‌گیره.
  • AL32UTF8: با توجه به پشتیبانی گسترده از Unicode و استانداردهای بین‌المللی، استفاده از این characterset در سیستم‌های جدید و برای آینده‌نگری توصیه می‌شه. Unicode به عنوان استاندارد جهانی برای نمایش و ذخیره‌سازی متن، اطمینان از تطابق با تکنولوژی‌های آینده را فراهم می‌کنه.مثلا شما اگر ENTERPRISE MANAGER بخوای نصب کنی، اکیداً توصیه میکنه که AL32UTF8 باشه.

بخوام خلاصه کنم، اگر حجم برامون مهمه، بهتره از AR8MSWIN1256  استفاده کنیم ولی اگر میخوایم خیالمون کلاً راحت باشه که به هیچ وجه دیگه مشکل کارکترست و پشتیبانی از اون برخوریم از AL32UTF8 استفاده میکنیم.

برگردیم سراغ مشکل. با اینکه کارکترست مبدا و مقصد AR8MSWIN1256 بود، در زمان import  با خطای زیر مواجه می شدیم و اجازه ساخت جداولی که داخلشون NVARCAHR(4000) تعریف شده بود رو نمیداد.

  ORA-00910: specified length too long for its datatype 

اگر مثل من به یاد پارامتر MAX_STRING_SIZE  افتادید، بدونید که شاید این موضوع جواب میداد ولی تفاوت دیگه ای که از نظرم دور مونده بود، باعث این مشکل بود.

NATIONAL CHARACTER SET

در زمان تعریف اون بصورت پیش فرض AL16UTF16  حداکثر طول NVARCHAR  میتونه 2000 تا باشه و در صورت تغییر به UTF8 میتونه تا 4000 تا رشد کنه.