अंत में रिक्त स्थान के साथ वरचर का व्यवहार


14

जब मैं रिक्त स्थान के साथ एक वर्चर का उपयोग करता हूं तो यह अंत में रिक्त स्थान की उपेक्षा करता है।

उदाहरण के लिए:

declare @X varchar(50)

यह...

set  @X= 'John'

...के समान है...

set @X= 'John           '

इसे वे समान मानते हैं। मैं सिस्टम को अलग-अलग पहचानने का कारण कैसे बना सकता हूं?

जवाबों:


23

सब कुछ ANSI मानक के अनुसार है:

ट्रेलिंग ब्लैंक समझाया :

SQL सर्वर रिक्त स्थान के साथ तार की तुलना करने के तरीके पर ANSI / ISO SQL-92 विनिर्देश (धारा 8.2, सामान्य नियम # 3) का अनुसरण करता है। एएनएसआई मानक को तुलना में उपयोग किए जाने वाले वर्ण तार के लिए पैडिंग की आवश्यकता होती है ताकि उनकी तुलना करने से पहले उनकी लंबाई मेल खाती हो। पैडिंग सीधे WHERE और HAVING क्लॉज के शब्दार्थ को प्रभावित करती है और अन्य Transact-SQL स्ट्रिंग तुलना को प्रभावित करती है। उदाहरण के लिए, Transact-SQL स्ट्रिंग्स 'एबीसी' और 'एबीसी' को अधिकांश तुलनात्मक संचालन के बराबर मानता है।

इस नियम का एकमात्र अपवाद LIKE विधेय है। जब LIKE विधेय अभिव्यक्ति के दाईं ओर एक अनुगामी स्थान के साथ एक मान देता है, तो SQL सर्वर तुलना करने से पहले एक ही लंबाई के लिए दो मानों को पैड नहीं करता है। क्योंकि 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 प्रकार में डालने के लिए - इस प्रकार को सपा के पैरामीटर के लिए बेहतर घोषित किया जा सकता है

शानदार पोस्ट, अंत में कुछ अच्छी जानकारी मिली
Gaspa79

-2

आप बस अपनी स्थिति में एक सफेद स्थान जोड़ सकते हैं।

set @X= 'John           \n'

स्ट्रिंग फ़ंक्शंस में ट्रेलिंग स्पेस


5
\nSQL सर्वर में कोई महत्व नहीं है। इसकी व्याख्या एक नई पंक्ति के रूप में नहीं की जाती है। यह वैसे भी पूछे गए सवाल का जवाब नहीं है।
मार्टिन स्मिथ

@MartinSmith लेकिन यह MSDN में लिखा है "यदि आपको अपनी स्ट्रिंग में अनुगामी स्थान रखना है, तो आपको अंत में एक सफेद स्थान वर्ण को जोड़ने पर विचार करना चाहिए, ताकि SQL सर्वर स्ट्रिंग को ट्रिम न करें।"
यिंगिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.