سلام
زمانی که data type شما از نوع var (به معنای متغیر/ variable) باشه تنها به اندازه ای که داده وارد کردین فضا اشغال میشه. و مقداری را که برای طول آن در نظر گرفتین برای تعیین سقف کاراکترهایی است که وارد میشن این کار بیشتر به منظور ایجاد یک نوع قید است. فرض کنید می خواهید شرطی را لحاظ کنید تا نام خانوادگی هایی وارد بشوند که متعارف اند. یک نام خانوادگی 500 حرفی قطعا یک نام متعارف نیست.
از طرفی اگر نوع داده شما از نوع ثابت باشد SQL Server به اندازه طول آن data type فضای دیسک را اشغال میکند و کاری به تعداد کاراکتر هایی که وارد شده است ندارد، و فضای باقیمانده را با کاراکتر space پر می کند.
در مثال زیر سه متغیر تعریف و مقدار دهی شده اند. و توسط تابع DATALENGTH فضای اشغال شده مشخص شده است
declare @varchar_20 varchar(20), @varchar_50 varchar(50), @fix_length char(20)
select @varchar_20 = '12345', @varchar_50 = '123', @fix_length = '1'
select DATALENGTH(@varchar_20) as varchar_20,
DATALENGTH(@varchar_50) as varchar_50,
DATALENGTH(@fix_length) as char_20
/*
varchar_20 varchar_50 char_20
----------- ----------- -----------
5 3 20
*/