खाली स्ट्रिंग्स: क्यों या कब '' के बराबर '' है?


17

कौन समझा सकता है क्यों

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

पैदावार

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

इसका मजेदार परिणाम यह है कि इसमें

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

अद्यतन वास्तव में रिक्त स्ट्रिंग को एक रिक्त स्थान से बदल देगा, लेकिन जहां खंड सही रहता है और अद्यतन विवरण के बार-बार निष्पादन को बताता है

(1 row(s) affected)

जवाबों:


22

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

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क्लॉज़ के बारे में कुछ और विवरण यहाँ दिए गए हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.