it-swarm.asia

سلوك Varchar بمسافات في النهاية

عندما أستخدم Varchar بمسافات فإنه يتجاهل المسافات في النهاية.

مثال:

declare @X varchar(50)

هذه...

set  @X= 'John'

...بالضبط مثل...

set @X= 'John           '

وتعتبر هذه متساوية. كيف يمكنني جعل النظام يتعرف عليها على أنها مختلفة؟

14
AMH

كل شيء وفقًا لمعيار ANSI:

شرح الفراغات الزائدة :

يتبع SQL Server مواصفات ANSI/ISO SQL-92 (القسم 8.2 ، القواعد العامة رقم 3) حول كيفية مقارنة السلاسل بالمسافات. يتطلب معيار ANSI حشو سلاسل الأحرف المستخدمة في المقارنات بحيث تتطابق أطوالها قبل مقارنتها. تؤثر الحشو بشكل مباشر على دلالات مسميات جملة WHERE و HAVING ومقارنات سلسلة Transact-SQL الأخرى. على سبيل المثال ، تعتبر Transact-SQL السلاسل "abc" و "abc" مكافئة لمعظم عمليات المقارنة.

الاستثناء الوحيد لهذه القاعدة هو المسند LIKE. عندما يتميز الجانب الأيمن من تعبير المسند LIKE بقيمة ذات مسافة زائدة ، لا يقوم SQL Server بتثبيت القيمتين بنفس الطول قبل حدوث المقارنة. لأن الغرض من المسند LIKE ، بحكم تعريفه ، هو تسهيل البحث عن الأنماط بدلاً من مجرد اختبارات المساواة في السلسلة البسيطة ، فإن هذا لا ينتهك القسم من مواصفات ANSI SQL-92 المذكورة سابقًا.

في ما يلي مثال معروف لجميع الحالات المذكورة أعلاه:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

إليك بعض التفاصيل الإضافية عن الفراغات اللاحقة والبند LIKE .

[~ # ~] لكن [~ # ~] إذا كنت ترغب في اختلافهم - قد تقرر استخدام وظيفة DATALENGTH بدلاً من LEN ، لأن

SELECT 1 WHERE LEN('John ') = LEN('John')

سيضعك 1 بدلا من

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

الحل هو

  • لاستخدام دالة DATALENGTH للاختلاف بين السلاسل
  • لإرسال السلسلة إلى نوع NVARCHAR - من الأفضل أن تعلن هذا النوع إلى معلمة SP
23
Oleg Dok