مقایسه جامع تابع LEN در SQL Server با DATALENGTH: طول رشتهها در یک نگاه
تابع LEN در SQL Server یکی از توابع پرکاربرد برای مدیریت و دستکاری رشتهها است. این تابع، تعداد کاراکترهای یک عبارت رشتهای مشخص را برمیگرداند. نکته مهمی که باید به آن توجه داشت این است که تابع LEN، فضاهای خالی انتهایی (trailing blanks) را در شمارش خود لحاظ نمیکند.
نحو استفاده از تابع LEN بسیار ساده است و به شکل زیر تعریف میشود:
LEN ( string_expression )
در این نحو، string_expression عبارتی رشتهای است که میخواهید طول آن را محاسبه کنید. این تابع یک مقدار عددی صحیح (int) را به عنوان خروجی بازمیگرداند که نشاندهنده تعداد کاراکترها است.
بیایید با یک مثال ساده شروع کنیم. این دستور طول رشته ‘SQL LEN function example’ را محاسبه میکند:
SELECT LEN('SQL LEN function example');
نتیجه این کوئری 24 خواهد بود.
تابع LEN با رشتههای یونیکد (NVARCHAR) نیز به خوبی کار میکند و تعداد کاراکترها را به درستی محاسبه میکند:
SELECT LEN(N'SQL LEN تابع مثال');
این دستور خروجی 18 را برمیگرداند، زیرا کاراکترهای فارسی نیز به عنوان یک کاراکتر واحد شمارش میشوند.
همانطور که قبلاً اشاره شد، تابع LEN فضاهای خالی انتهایی (trailing spaces) را نادیده میگیرد. به این مثال توجه کنید:
SELECT LEN('SQL LEN ');
با وجود اینکه رشته شامل چند فضای خالی در انتها است، خروجی این کوئری 7 خواهد بود، زیرا تابع تنها کاراکترهای واقعی را تا قبل از فضاهای خالی انتهایی میشمارد.
برای انواع داده VARBINARY و IMAGE، تابع LEN همیشه مقدار صفر را برمیگرداند. این نکته برای کار با دادههای باینری حیاتی است:
SELECT LEN(CAST('Hello' AS VARBINARY(10)));
و
SELECT LEN(CAST(0x010203 AS IMAGE));
در هر دو مورد، خروجی 0 خواهد بود.
هنگامی که تابع LEN را روی یک نوع داده DATETIME اعمال میکنید، SQL Server ابتدا آن را به یک رشته تبدیل کرده و سپس طول آن رشته را محاسبه میکند. نتیجه میتواند بسته به فرمت تاریخ و زمان فعلی سیستم متفاوت باشد:
SELECT LEN(GETDATE());
نتیجه این کوئری بسته به تنظیمات منطقهای سرور شما میتواند متفاوت باشد، مثلاً 23 برای فرمت پیشفرض.
اگر ورودی تابع LEN مقدار NULL باشد، خروجی نیز NULL خواهد بود. این رفتار برای مدیریت مقادیر نامشخص اهمیت دارد:
SELECT LEN(NULL);
خروجی این دستور NULL خواهد بود.
یکی از سوالات متداول در مورد تابع LEN، تفاوت آن با تابع DATALENGTH است. درک این تفاوت برای بهینهسازی و کار با دادهها در SQL Server بسیار حیاتی است:
LEN: تعداد کاراکترهای یک رشته را محاسبه میکند و فضاهای خالی انتهایی را نادیده میگیرد.DATALENGTH: تعداد بایتهای مصرفی توسط یک عبارت را محاسبه میکند. این تابع فضاهای خالی انتهایی را نیز لحاظ میکند و برای انواع داده یونیکد (مانندNVARCHAR)، هر کاراکتر را 2 بایت در نظر میگیرد.
برای درک بهتر تفاوت LEN و DATALENGTH، به مثالهای زیر توجه کنید:
مثال با VARCHAR:
DECLARE @v_char VARCHAR(50) = 'SQL LEN ';
SELECT LEN(@v_char) AS LenValue, DATALENGTH(@v_char) AS DataLengthValue;
در این مثال، LenValue برابر با 7 (نادیده گرفتن 6 فضای خالی انتهایی) و DataLengthValue برابر با 13 (7 کاراکتر + 6 فضای خالی = 13 بایت) خواهد بود.
مثال با NVARCHAR:
DECLARE @n_var_char NVARCHAR(50) = N'SQL LEN ';
SELECT LEN(@n_var_char) AS LenValue, DATALENGTH(@n_var_char) AS DataLengthValue;
برای NVARCHAR، LenValue همچنان 7 است، اما DataLengthValue برابر با 26 خواهد بود (زیرا هر کاراکتر در NVARCHAR 2 بایت فضا اشغال میکند، پس 13 کاراکتر ضربدر 2 بایت برابر با 26 بایت میشود).
مثال با VARBINARY:
DECLARE @v_binary VARBINARY(50) = 0x010203;
SELECT LEN(@v_binary) AS LenValue, DATALENGTH(@v_binary) AS DataLengthValue;
در این حالت، LenValue برابر با 0 (زیرا LEN برای دادههای باینری صفر برمیگرداند) و DataLengthValue برابر با 3 (تعداد بایتهای واقعی داده) خواهد بود.