تفاوت نوع داده VarChar(Max) و VarChar(n) در چیست؟

نوع داده (VARCHAR(Max) - NVARCHAR(max) - VARBINARY(max از Sql 2005 به جای نوع TEXT – NTEXT - IMAGE معرفی شده است . همه این نوع داده های تا حداکثر 2 گیگابات اطلاعات را میتوانند ذخیره کنند به جز نوع داده NVARCHAR که حداکثر تا یک گیگابات اطلاعات یونیکد شده را میتواند در خود جای دهد .یک سوالی که ممکن است پیش بیایید این هست که چرا با وجود اینکه نوع VARCHAR میتواند تا دو گیگابایت اطلاعات را ذخیره کند مقدار n در نوع (VARCHAR(n حداکثر 8000 است و مقدار بیش از این خطا میدهد ؟؟ دلیل این هست که اطلاعات در صفحات 8 کیلوبایتی ذخیره می شوند (8192 بایت) . از این مقدار 96 بایت برای ذخیره اطلاعات هدر صفحه مصرف میشود و مابقی 8096 بایت باقی مانده برای ذخیره دیتا - افست –سربار - استفاده میشود. در واقع مقدار 8000 بایت باقی مانده را شما میتوانید برای ذخیره داده استفاده کنید .تفاوت ها:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

نحوه تعریف

DECLARE @Name VARCHAR(Max)= 'Sahar'         
DECLARE @Name VARCHAR(50)= 'Sahar' 

حداکثر ظرفیت

VARCHAR(Max)  :  2 147 483 647 Byte - 2 Giga Byte
VARCHAR(n)  :  8000 byte  

قابلیت ایندکس گذاری

  • (VARCHAR(Max : قابلیت ایندکس گذاری ندارد . در صورتی سعی کنید ایندکس ایجاد کنید با خطای زیر مواجه خواهید شد :
..is of a type that is invalid for use as a key column in an index.
  • (VARCHAR(n : امکان ایندکس گذاری بر روی این نوع داده وجود دارد.

نحوه ذخیره سازی اطلاعات

  • (VARCHAR(Max : یک سطر داده در صفحات ۸ کیلوبایتی ذخیره میشوند تا زمانی که سر ریز اتفاق بیافتد . در واقع اگر میزان اطلاعات یک سطر بیش از مقدار تعیین شده یک صفحه باشد مابقی اطلاعات به فرمت Text قدیمی ذخیره میشوند
  • (VARCHAR(n : مشابه سایر دیتا ها در صفحات 8 کیلوبایتی

چه موقع استفاده کنیم

  • (VARCHAR(Max: وقتی دیتاییی که قصد ذخیره آن را داریم بیش از 8000 بایت فضا اشغال میکند مثل یک فایل متن . برای داده هایی حجیم که به آنها گاها CLOB یعنی Character Large Object هم گفته میشود.
  • (VARCHAR(n: در واقع اگر ما بدانیم نوع داده ای که داریم کمتر از 8000 بایت فضا اشغال میکند مثل آدرس و نام و نام خانوادگی و...

در واقع اختلاف عملکرد زیادی بین این دو نوع وجود ندارد ولی اگر حدس میزنیم که نوع داده مان کمتر از 8000 بایت فضا اشغال میکند خواهشا از نوع (varchar(n استفاده کنیم ، مثال زیر را میتوانید برای مقایسه دو نوع داده اجرا کنید و مدت زمان اجرای دستور را ببینید مدت زمان اجرا زمانی که نوع داده (Varchar(50 تعریف شده است به مراتب کمتر است :

DECLARE @FirstName VARCHAR(MAX), @COUNT INT=0, 
        @StartTime DATETIME = GETDATE()
WHILE(@COUNT < 1000000)
BEGIN
   SELECT @FirstName = 'Sahar', @COUNT = @COUNT +1
END
SELECT DATEDIFF(ms,@StartTime,GETDATE()) 'Time Taken in ms'
GO 6

(VARCHAR(MAX و (VARCHAR(50 را برای مثال بالا تست کنید و مدت زمان اجرا را مشاهده کنید.


نظرات