کشف اسرار DATALENGTH در SQL Server: محاسبه دقیق اندازه دادهها بر اساس بایت
تابع DATALENGTH در SQL Server برای تعیین طول یک عبارت بر حسب بایت استفاده میشود. این تابع به خصوص زمانی مفید است که نیاز به درک دقیق فضای ذخیرهسازی اشغال شده توسط دادهها، به ویژه برای انواع دادههایی مانند VARCHAR، NVARCHAR و VARBINARY دارید.
فرم کلی استفاده از این تابع به صورت زیر است:
DATALENGTH (expression)
در اینجا expression میتواند هر نوع دادهای باشد که DATALENGTH میتواند طول آن را بر حسب بایت محاسبه کند. برای مثال، اگر یک رشته متنی را به آن بدهید، تعداد بایتهای اشغال شده توسط آن رشته را برمیگرداند. این تفاوت اصلی با تابع LEN است که تعداد کاراکترها را برمیگرداند.
تفاوت اساسی بین DATALENGTH و LEN زمانی آشکار میشود که با فضاهای خالی انتهای رشته سروکار دارید. تابع DATALENGTH تمام فضاهای خالی انتهایی را در شمارش خود لحاظ میکند، در حالی که LEN آنها را نادیده میگیرد. این ویژگی DATALENGTH را برای بررسی دقیق فضای ذخیرهسازی اشغال شده بسیار مناسب میسازد.
به عنوان مثال، برای مشاهده نحوه عملکرد DATALENGTH با یک رشته ساده:
SELECT DATALENGTH('SQL DATALENGTH Function');
خروجی این دستور 25 خواهد بود، زیرا رشته “SQL DATALENGTH Function” دقیقاً 25 کاراکتر و در نوع VARCHAR، 25 بایت طول دارد.
اکنون تفاوت DATALENGTH و LEN را با وجود فضاهای خالی انتهای رشته بررسی میکنیم:
SELECT DATALENGTH('SQL DATALENGTH Function ');
این کوئری 32 را برمیگرداند، زیرا شامل هفت فضای خالی انتهایی اضافه بر 25 کاراکتر اصلی است. در مقابل، تابع LEN همان رشته را به این صورت پردازش میکند:
SELECT LEN('SQL DATALENGTH Function ');
خروجی LEN برای این رشته 25 خواهد بود، زیرا فضاهای خالی انتهایی را در نظر نمیگیرد و تنها تعداد کاراکترهای واقعی را برمیگرداند.
وقتی با نوع داده NVARCHAR سروکار داریم، هر کاراکتر دو بایت فضا اشغال میکند. این تفاوت در محاسبه بایتها توسط DATALENGTH به خوبی نمایان میشود:
SELECT DATALENGTH(N'SQL DATALENGTH Function');
خروجی این دستور 50 خواهد بود، زیرا 25 کاراکتر در NVARCHAR هر کدام 2 بایت هستند (25 * 2 = 50). همانطور که انتظار میرود، برای رشتهای با فضاهای خالی انتهایی در NVARCHAR:
SELECT DATALENGTH(N'SQL DATALENGTH Function ');
خروجی 64 خواهد بود (32 کاراکتر شامل فضاهای خالی * 2 بایت برای هر کاراکتر). در حالی که LEN همچنان فقط تعداد کاراکترهای واقعی را گزارش میدهد:
SELECT LEN(N'SQL DATALENGTH Function ');
خروجی 25 خواهد بود.
تابع DATALENGTH همچنین برای انواع داده VARBINARY نیز کاربرد دارد. برای مثال، اگر یک رشته را به VARBINARY تبدیل کنید، DATALENGTH تعداد بایتهای آن را باز میگرداند:
SELECT DATALENGTH(CAST('SQL DATALENGTH Function' AS VARBINARY(50)));
این کوئری خروجی 25 را خواهد داشت، زیرا هر کاراکتر به یک بایت در VARBINARY تبدیل میشود و طول رشته 25 کاراکتر است.
رفتار DATALENGTH با مقادیر NULL بسیار مشخص است. زمانی که ورودی NULL باشد، تابع نیز NULL را برمیگرداند:
SELECT DATALENGTH(CAST(NULL AS VARCHAR(50)));
خروجی این دستور NULL خواهد بود. اما برای یک رشته خالی یا یک رشته تنها شامل فضای خالی، نتایج متفاوت است:
SELECT DATALENGTH(CAST('' AS VARCHAR(50)));
این دستور 0 را برمیگرداند، به معنی اینکه رشته خالی هیچ بایت فضایی اشغال نمیکند. و برای رشتهای شامل فقط یک فضای خالی:
SELECT DATALENGTH(CAST(' ' AS VARCHAR(50)));
خروجی 1 خواهد بود، زیرا یک بایت توسط فضای خالی اشغال شده است.
تابع DATALENGTH همچنین میتواند برای انواع دادههای عددی و زمانی استفاده شود تا اندازه ثابت آنها را بر حسب بایت نشان دهد. این میتواند در سناریوهای بهینهسازی ذخیرهسازی مفید باشد.
برای مثال، برای یک مقدار تاریخ و زمان:
SELECT DATALENGTH(GETDATE());
خروجی 8 خواهد بود، زیرا نوع داده DATETIME در SQL Server 8 بایت فضا اشغال میکند.
برای یک عدد صحیح INT:
SELECT DATALENGTH(CAST(12345 AS INT));
خروجی 4 خواهد بود، چرا که INT چهار بایت فضا نیاز دارد.
برای یک عدد اعشاری DECIMAL:
SELECT DATALENGTH(CAST(12345.67 AS DECIMAL(10,2)));
خروجی 9 خواهد بود، زیرا DECIMAL(10,2) در SQL Server 9 بایت فضا اشغال میکند.
و برای یک شناسه منحصر به فرد UNIQUEIDENTIFIER:
SELECT DATALENGTH(CAST(NEWID() AS UNIQUEIDENTIFIER));
خروجی 16 خواهد بود، زیرا UNIQUEIDENTIFIER همیشه 16 بایت فضا اشغال میکند.