همانطور که می دانیم در مفاهیم پایگاه داده های رابطه ای برای ذخیره و دسته بندی اطلاعات ( داده ها ) ، جداولی وجود دارد که در آن ، داده ها در سطر ها و ستونی هایی که متناظر با هم هستند قرار می گیرند . هر سطر از یک جدول ، بیانگر یک رکورد منحصر به فرد ، و همچنین ستون های آن جدول ، مشخصه ها و ویژگیهایی برای آن رکوردها می باشند . که توسط این ستون ها می توان اطلاعات بیشتری در مورد هر یک از سطرها ( رکوردها ) کسب کرد.
به عنوان مثال جدول مربوط به اطلاعات شخصی کارمندان یک شرکت را در نظر بگیرید . از خصوصیات مربوط به این افراد می توان به نام و نام خانوادگی ، تاریخ تولد ، شماره تماس ، آدرس ، میزان حقوق دریافتی ، آدرس ایمیل و … اشاره کرد که هر کدام از این خصوصیات در قالب یک ستون مشخص می شود و در هر کدام از آنها یک نوع داده ذخیره می شود ، مثلا در ستون نام و نام خانوادگی داده هایی از نوع داده ای کاراکتری ( string ) و در ستون مربوط به تاریخ تولد از نوع داده ای تاریخ (date) استفاده می شود . در واقع نوع داده یک ستون ، تعیین می کند که چه نوع مقداری باید در آن ذخیره شود
انواع داده در اوراکل ( datatypes )
در بانک اطلاعاتی اوراکل داده ها به 5 دسته ی کلی تقسیم می شوند :
# انواع داده ی کاراکتری ( character datatypes )
# انواع داده ی عددی ( numeric datatypes )
# انواع داده تاریخ / زمان ( date datatypes )
# انواع داده اشیاء بزرگ ( large object (LOB) datatypes )
# انواع داده برای آدرس دهی سطرهای یک جدول ( rowid datatypes )
1- انواع داده های کاراکتری
از این نوع داده جهت ذخیره کلمات و حروف استفاده می شود که در اصطلاح هر کلمه ، بیانگر یک یا چند character و به مجموع character ها یک رشته یا string می گویند . داده های کاراکتری شامل انواع مختلفی است که در زیر به آنها اشاره شده است :
الف ) داده های کاراکتری با حجم فضای اشغال شده ی ثابت :
این داده ها با توجه به ظرفیت و گنجایش فضای خود می توانند تعدادی کاراکتر ( حداکثر تا سقف مجاز ) را در خود ذخیره کنند و در صورتی که ظرفیت آنها با کاراکترها پر نشود حجم فضای اشغال شده توسط آنها تغییر نمی کند و فضای خالی را در خود نگه می دارند . char ، nchar و long از انواع مختلف این نوع داده محسوب می شوند که هر کدام از آنها در زیر بررسی شده اند :
Char: در این نوع داده ، حروف الفبا ذخیره می شود که حجم فضای اشغال شده توسط کاراکتر های آن نباید بیشتر از عددی که به عنوان size درون پرانتز قرار گرفته است ، باشد و همچنین با در نظر گرفتن این موضوع که هر کاراکتر فضای مشخصی از یک دیتابلاک ( کوچکترین واحد منطقی از دید اوراکل ) را اشغال می کند، حجم فضای اختصاص داده شده به یک داده از نوع char ، نباید بیشتر از 2000 بایت باشد .
برای مثال (char(10 میتواند رشته ای به طول 10 کاراکتر ( با حروف الفبای انگلیسی ) را در خود نگه دارد و از آنجایی که در الفبای انگلیسی ، به ازای هر کاراکتر 1 بایت فضا اشغال می شود ، در مثال فوق 10 بایت فضا به این ستون با نوع داده ای char اختصاص داده شده است و در صورتی که کاراکترهای کمتری در ن آن
آن ذخیره گردد ، با توجه به طول ثابت این نوع داده ، مابقی حجم داده ی char را با فضای خالی پر کرده و همان 10 بایت فضا را اشغال می کند .
NChar: این نوع داده از تمام ویژگیهای char برخوردار است و در آن از کاراکتر هایی با عنوان Unicode ، ( national character set ) ( داده هایی با زبان الفبایی غیر از انگلیسی ) ذخیره می شود
برای مثال در این نوع داده می توان از national character set هایی نظیر UTF8 و AL16UTF16 استفاده کرد
Long: از این نوع داده برای ذخیره سازی رشته هایی با طول ثابت و با حجم فضایی معادل 2 گیگابایت ، برای متن های طولانی استفاده کرد .
ب ) داده های کاراکتری با تعداد کاراکتر و حجم فضای اشغال شده ی متغیر :
در این نوع داده ها ، بر خلاف داده های قبلی که طول ثابتی داشتند ، به ازای هر کاراکتری که در آن ذخیره می شود فضایی از دیتابلاک را اشغال کرده و فضای خالی را در خود نگه نمی دارد . varchar2 ، nvarchar2 ، raw و long raw از انواع مختلف این داده محسوب می شوند که در زیر بررسی شده اند :
Varchar2: در این نوع داده ، کاراکتر هایی با طول متغیر در فضایی بین 1 تا 32000 بایت ذخیره می شود و فضای اشغال شده توسط این نوع داده دقیقا به نوع و تعداد کاراکترهای ذخیره شده در آن بستگی دارد .
مثلا اگر در ستونی از یک جدول ، نوع داده ی varchar(50) در نظر گرفته شده باشد و همینطور اطلاعات مربوط به فردی با 10 کاراکتر انگلیسی در آن ذخیره شده باشد ، مقدار فضای اشغال شده برای این داده همان 10 بایت می باشد .
Nvarchar2 : شبیه varchar2 است با این تفاوت که از کاراکتر های Unicode ( که در بالا به آنها اشاره شد ) هم پشتیبانی می کند . این نوع داده ، بهترین نوع برای ذخیره کاراکتر های فارسی می باشد
Raw : برای ذخیره مقادیر کاراکتری به صورت باینری با طول متغیر استفاده می شود و حداکثر فضایی که می تواند اشغال کند ، 2000 بایت است .
Long raw : از این نوع داده جهت ذخیره سازی مقادیر طولانی کاراکتری به صورت باینری و با حداکثر فضایی معادل 2 گیگابایت استفاده می شود .
نکته 1 : از آنجایی که هر کاراکتر فارسی معادل 2 بایت و دو برابر یک کاراکتر انگلیسی فضا اشغال می کند ، برای ذخیره سازی حروف الفبای فارسی در نوع های داده ای که در بالا به آنها اشاره شد ، باید این نکته را در نظر گرفت که حداکثر تعداد کاراکترهای ذخیره شده با حروف فارسی نصف حداکثر تعداد کاراکترهای ذخیره شده با حروف انگلیسی است .
نکته 2 : حداکثر تعداد کاراکتر در ستون های nchar با character set UTF8 ، برابر با 2000 کاراکتر ، و با AL16UTF16 character set ، برابر با 1000 کاراکتر است . ( چون در AL16UTF16 به ازای هر کاراکتر 2 بایت فضا اشغال می شود ).
2- انواع داده های عددی
از داده های عددی جهت ذخیره مقادیر عددی مثبت و منفی ، یا صحیح و اعشاری استفاده می شود که انواع آن عبارتند از number ، integer ، smallint ، bigint ، decimal ، float ، real ، double و …
که در زیر دو مدل پرکاربرد number و integer شرح داده شده است :
Number : از این نوع داده برای ذخیره اعداد صفر ، مثبت و منفی همراه با اعشار ( در صورت وجود ) استفاده می شود و قالب کلی آن برابر است با : number [(precision) [,scale])]
Precision : این ویژگی تعداد کل ارقام شامل قسمت صحیح ، قسمت اعشار و علامت اعشار را مشخص می کند که مقدار پیش فرض آن ماکزیمم 38 است .
Scale : مقدار این پارامتر می تواند بین 84- و 127 باشد و اگر تعداد این اعشار از مقدار تعیین شده برای scale بیشتر باشد ، عدد اصلاح می شود .
مثال :
در مثال زیر عدد 12345.6789 ، در حالتهای مختلف number با precision و scale های مختلف بررسی شده است :
نکته : نوع داده ای decimal (p,s) همانند نوع number می باشد
Integer : مانند نوع داده ایnumber می باشد با این تفاوت که مقدار scale در آن برابر با صفر است ، بعبارت دیگر از این نوع داده فقط برای ذخیره اعداد صحیح استفاده می شود .
3- انواع داده های تاریخ / زمان
یکی دیگر از اصلی ترین انواع داده در اوراکل ، داده های مربوط به تاریخ / زمان است که به دو دسته کلی تقسیم می شود
# داده های date/time
# داده های interval
الف ) داده های date/time : داده هایی برای ذخیره و نمایش اطلاعات مربوط به تاریخ و زمان است که به چهار دسته تقسیم می شود :
DATE : این نوع داده ای ، زمان و تاریخ را به صورت یک رشته با اندازه 7 بایت در یک ستون از جدول ذخیره می کند که در بازه زمانی january 1 , 4712 قبل از میلاد تا December 31 , 9999 قرار می گیرد و همچنین مقدار پیش فرض زمان در آن 00:00:00 است .
مقدار نمایش داده شده در خروجی به شکل dd-mon-yy است و برای نمایش زمان هم از تابعی به نام TO_CHAR استفاده می شود
به عنوان مثال خروجی دستور زیر بررسی می شود :
SQL> select startup_time from v$instance;
STARTUP_TIME
-> ———————
04-DEC-18
همانطور که در دستور بالا مشاهده می شود تاریخ در فرمتی غیر استاندارد نمایش داده شده است ، برای نمایش تاریخ در فرمت استاندارد و همچنین نمایش زمان ، از تابع TO_CHAR به شکل زیر استفاده می شود :
SQL> select TO_CHAR ( startup_time , ‘yyyy/mm/dd hh24:mi:ss’ ) from v$instance;
TO_CHAR(STARTUP_TIME , ‘YYYY/MM/DD HH24:MI:SS’
-> —————————————————————————
2018/12/04 12:01:09
TIMESTAMP : این نوع داده ، شبیه نوع داده DATE است با این تفاوت که اندازه آن 11 بایت می باشد و precision در آن ، تعداد ارقام کسری بخش ثانیه را مشخص می کند که می تواند از صفر تا نه عدد داشته باشد . مقدار پیش فرض آن شش است .
TIMESTAMP [(precision)] WITH TIMEZONE : این نوع داده همانند نوع داده ای TIMESTAMP است با این تفاوت که اختلاف زمانی بین ساعت جهانی (UCT) و ساعت محلی را بر حسب ساعت و دقیقه نگهداری می کند
TIMESTAMP [(precision)] WITH LOCAL TIMEZONE : این نوع داده ای نیز همانند انواع قبلی ، اختلاف زمانی محلی و ساعت جهانی را محاسبه می کند با این تفاوت که آنرا دیگر درون بانک ذخیره نمی کند و فقط موقع درخواست کاربر ، مقدار مورد نظر را بر حسب timezone محل کاربر ، نمایش می دهد .
ب ) داده های INTERVAL : این نوع داده ها جهت محاسبه و ذخیره فواصل زمانی ، بر حسب سال و ماه است و به دو دسته زیر تقسیم می شود :
INTERVAL YEAR [( precision )] TO MONTH : از این نوع داده جهت محاسبه و ذخیره اختلاف بین دو مقدار داده ای DATE و یا دو مقدار داده ای TIMESTAMP بر حسب سال و ماه استفاده می شود . مقدار precision تعداد ارقام سال را مشخص می کند و به صورت پیش فرض 2 می باشد .
INTERVAL DAY [( d_precision)] TO SECOND : مانند حالت قبل است با این تفاوت که اختلاف را بر حسب روز و ساعت و دقیقه و ثانیه محاسبه می کند .
d_precision تعداد ارقام روز را مشخص می کند که می تواند بین صفر تا نه باشد . مقدار پیش فرض آن دو است .s_precision تعداد ارقام کسری بخش ثانیه را تعیین می کند که می تواند مقدار بین صفر تا نه را بگیرد . مقدار پیش فرض آن شش است .
4- انواع داده ای اشیاء بزرگ(LOB) (LARGE OBJECT)
همان طور که از نامش پیداست از این نوع داده جهت نگهداری اشیاء بزرگ (داده های با حجم زیاد) در بانک اطلاعاتی استفاده می شود . اگر فرض کنیم هر بلاک داده ای (data block) تعیین شده در اوراکل ، 8 کیلو بایت در نظر گرفته شده باشد ، این نوع داده می تواند تا 32 ترابایت ، دیتا در خود ذخیره کند که بیشتر جهت نگهداری متن های طولانی ، فیلم ، تصویر ، صوت و … استفاده می شود
این نوع داده ها ، به دسته های زیر تقسیم می شود :
CLOB : از این نوع داده برای نگهداری رشته های کاراکتری خیلی بزرگ استفاده می شود .
NCLOB : همانند نوع قبل است با این تفاوت که national character set های اوراکل را نیز پشتیبانی می کند .
BLOB : از این نوع داده برای اشیاء خیلی بزرگ مثل فیلم و صوت و … با اندازه حداکثر 4 گیگا بایت به صورت باینری استفاده می شود .
BFILE : برای نگهداری نام و مسیر فایل های باینری ذخیره شده بر روی سیستم عامل استفاده می شود و حداکثر تا 4 گیگابایت داده نگهداری می کند .
( مقدار داده در ستونی با نوع داده bfile ، read-only است و نمی توان آنرا تغییر داد ) .
نکته : داده های نوع long و long raw که در قسمت های بالاتر توضیح داده شد را نیز می توان جزء دسته داده های اشیاء بزرگ قلمداد کرد.
5- انواع داده های rowids
هر جدول در بانک اطلاعاتی یک ستون داخلی با نام rowid دارد که مقدار محل فیزیکی رکورد را در خود ، ذخیره می کند و بصورت پیش فرض در دستورات select و describe ظاهر نمی شود برای مشاهده آن باید نام این ستون ( rowid ) را بصورت صریح در دستور select مشخص نمود :
Select rowid, test.* from test;
در دستور بالا ، مقادیر ستون rowid را در کنار داده های دیگر ستون های جدول Test ، نمایش داده می شود .
هر رکورد در هر جدول دارای یک rowid منحصر به فرد می باشد و به دو نوع مختلف physical و logical تقسیم می شود :
Physical rowids : این نوع داده آدرس فیزیکی هر سطر از یک جدول را در ستون rowid ذخیره می کند ( تمامی جداول به جز جدول هایی با ساختار IOT یا همان index-organized tables )
Logical rowids : این نوع داده فقط آدرس سطر های جداولی با ساختار IOT را نگهداری می کند .
متشکرم. مطلب خیلی خوب و کاملی است .