سؤال

واجهت مؤخرا مشكلة عند استخدامها len() في استعلام لمعرفة طول الاستعلام، len() لم يكن عد المساحات الزائدة في القيمة. ولكن datalength() هو حساب المساحات الزائدة أيضا.

هل هذا يعني أنه إذا كنت أفعل بعض العملية التي تتعامل مع الطول الفعلي للقيمة، فعليني استخدامها dalalength() على len().

على سبيل المثال: إذا كنت بحاجة إلى قيمة قيمة معينة لتكون من 10 أحرف. أي إذا كانت القيمة هي 3 بطول حرفي، فقد ألغيت 7 مسافات لها.

هل كانت مفيدة؟

المحلول

نعم هذا بالضبط ما يجب عليك فعله. إذا كنت ترغب في الحصول على عدد الأحرف باستثناء الفراغات التي ستستخدمها LEN() وظيفة، في حين في جميع الحالات الأخرى DATALENGTH().

حتى في LEN() يحتوي الوثائق على معلومات للحصول على عدد البايتات لتمثيل التمديد الذي يجب عليك استخدامه DATALENGTH()

فيما يلي الروابط إلى مستندات MSDN:

لين ()

طول البيانات()

نصائح أخرى

كن حذرا. طول البيانات إرجاع عدد البايتات المستخدمة، وليس عدد الأحرف.

لين يحسب عدد الأحرف المستخدمة وليس التخزين المطلوب، سيكون هذا أكثر وضوحا عند استخدام NVARCHAR بدلا من Varchar

لين لا يحسب مسافات زائدة إما

تفقد هذا

declare @v nchar(5)
select @v ='ABC  '


select len(@v),datalength(@v)

والإخراج لين هو 3 في حين أن الإخراج لشغال datal = 10

مجرد استخدام استبدال ():

SELECT LEN(REPLACE(N'4 Trailing Spaces:    ', ' ', '_'))

سيؤدي ذلك إلى استبدال المساحات الزائدة ذات حرف Len () في الواقع.

المشكلة مع DataLength () هل يتعين عليك تتبع أحدث سلسلة الخاص بك هو Unicode (NCHAR، NVARCHAR) أو ASCII (Char، varchar) لمعرفة ما إذا كنت بحاجة أيضا إلى تقسيم طول DataL من سلسلة Unicode بمقدار 2.

كنت على وشك استخدام LEN (استبدل ("BLAH BLAH"، "،"، "_") عندما أضربني قد يكون أكثر فعالية للاستخدام. فقط نشر في حالة تعثر شخص ما على هذا الموضوع كما فعلت.

لين ('blah blah' + '') - 1

لسوء الحظ، لا يوجد حل مثالي وأنا أدرك.

واحدة من الحلول المقترحة، LEN(string + '.')-1 إرجاع نتائج خاطئة (-1) إذا كانت السلسلة هي Unicode من حجم 4000 أو غير Unicode وحجم 8000. وهذا لأنه يتم تجاهل التسليط. يمكنك التغلب على هذا إذا كنت تريد، عن طريق إلقاء السلسلة إلى سلسلة بحجم القصوى: LEN(CAST(string as nvarchar(max)) + '.')-1, ، ولكن هل يستحق كل هذا العناء؟

كما ذكرها الآخرين، DATALENGTH(string) إرجاع عدد البايتات المستخدمة للتخزين. بالنسبة إلى سلاسل يونيكود، قد لا يكون ذلك كافيا لتقسيم النتيجة 2: أحنان Unicode البديلة يمكن أن يستغرق أكثر من 16 بت.

الكل في الكل، يكونوا في اعتبارهم قيود كل نهج واختيار ما تعتقد أنه سيؤدي إليك مشاكل أقل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top