مقایسه جامع تابع 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
(تعداد بایتهای واقعی داده) خواهد بود.