sql server - एसक्यूएल सर्वर 2008 खाली स्ट्रिंग बनाम अंतरिक्ष



sql-server sql-server-2008 (5)

= ऑपरेटर टी-एसक्यूएल इतना "बराबर" नहीं है क्योंकि यह अभिव्यक्ति के संदर्भ के संयोजन के अनुसार "वही शब्द / वाक्यांश है" और एलईएन "शब्द / वाक्यांश में वर्णों की संख्या" है। कोई भी कॉलेशन उनसे पहले शब्द / वाक्यांश के हिस्से के रूप में पिछली रिक्त स्थान का इलाज नहीं करती है (हालांकि वे पहले की स्ट्रिंग के हिस्से के रूप में प्रमुख रिक्त स्थान का इलाज करते हैं)।

यदि आपको 'इस' से 'इस' को अलग करने की आवश्यकता है, तो आपको "एक ही शब्द या वाक्यांश" ऑपरेटर का उपयोग नहीं करना चाहिए क्योंकि 'यह' और 'यह' एक ही शब्द हैं।

रास्ते = योगदान में योगदान यह विचार है कि स्ट्रिंग-समानता ऑपरेटर को अपने तर्कों की सामग्री और अभिव्यक्ति के संयोजन संदर्भ पर निर्भर होना चाहिए, लेकिन यह तर्कों के प्रकारों पर निर्भर नहीं होना चाहिए, यदि वे दोनों स्ट्रिंग प्रकार हैं ।

"ये वही शब्द" की प्राकृतिक भाषा अवधारणा आमतौर पर गणितीय ऑपरेटर द्वारा कब्जा करने में सक्षम होने के लिए पर्याप्त सटीक नहीं है, और प्राकृतिक भाषा में स्ट्रिंग प्रकार की कोई अवधारणा नहीं है। संदर्भ (यानी, संयोजन) मायने रखता है (और प्राकृतिक भाषा में मौजूद है) और कहानी का हिस्सा है, और अतिरिक्त गुण (कुछ जो विचित्र लगते हैं) = की परिभाषा का हिस्सा हैं ताकि इसे अप्राकृतिक दुनिया में अच्छी तरह से परिभाषित किया जा सके। डेटा।

प्रकार के मुद्दे पर, आप अलग-अलग स्ट्रिंग प्रकारों में संग्रहीत होने पर शब्दों को बदलना नहीं चाहते हैं। उदाहरण के लिए, VARCHAR (10), CHAR (10), और CHAR (3) के प्रकार सभी 'बिल्ली' शब्द का प्रतिनिधित्व कर सकते हैं, और? = 'बिल्ली' हमें यह तय करने देनी चाहिए कि इनमें से किसी भी प्रकार का मूल्य 'बिल्ली' शब्द (मामले के मुद्दों और संयोजन द्वारा निर्धारित उच्चारण के साथ) रखता है।

जॉनएफएक्स की टिप्पणी का जवाब:

ऑनलाइन पुस्तकों में चार और वर्कर डेटा का उपयोग देखें। उस पृष्ठ से उद्धरण, जोर मेरा:

प्रत्येक चार और वर्कर डेटा मान में एक संयोजन होता है। कोलेक्शन प्रत्येक चरित्र, तुलना नियम , और केस या उच्चारण करने की संवेदनशीलता का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले बिट पैटर्न जैसे गुण परिभाषित करते हैं।

मैं मानता हूं कि इसे ढूंढना आसान हो सकता है, लेकिन यह दस्तावेज है।

ध्यान देने योग्य मूल्य यह भी है कि एसक्यूएल के अर्थशास्त्र, जहां = वास्तविक दुनिया के डेटा और तुलना के संदर्भ (कंप्यूटर पर संग्रहीत बिट्स के बारे में कुछ के विपरीत) के साथ करना है, लंबे समय से एसक्यूएल का हिस्सा रहा है। आरडीबीएमएस और एसक्यूएल का आधार असली दुनिया के डेटा का वफादार प्रतिनिधित्व है, इसलिए समान विचारों (जैसे संस्कृतिइन्फो) से कई साल पहले कोलेशन के लिए इसका समर्थन अल्गोल जैसी भाषाओं के दायरे में प्रवेश किया। उन भाषाओं का आधार (कम से कम हाल ही में) इंजीनियरिंग में समस्या हल करने, व्यापार डेटा के प्रबंधन नहीं था। (हाल ही में, गैर-इंजीनियरिंग अनुप्रयोगों जैसे खोज में समान भाषाओं का उपयोग कुछ मार्ग बना रहा है, लेकिन जावा, सी #, और इसी तरह से अभी भी अपनी गैर-व्यावसायिक जड़ों से जूझ रहे हैं।)

मेरी राय में, "अधिकांश प्रोग्रामिंग भाषाओं" से अलग होने के लिए एसक्यूएल की आलोचना करना उचित नहीं है। एसक्यूएल को बिजनेस डेटा मॉडलिंग के लिए एक ढांचे का समर्थन करने के लिए डिज़ाइन किया गया था जो इंजीनियरिंग से बहुत अलग है, इसलिए भाषा अलग है (और इसके लक्ष्य के लिए बेहतर)।

बिल्ली, जब एसक्यूएल पहले निर्दिष्ट किया गया था, कुछ भाषाओं में कोई अंतर्निहित स्ट्रिंग प्रकार नहीं था। और कुछ भाषाओं में, तारों के बीच बराबर ऑपरेटर चरित्र डेटा की तुलना नहीं करता है, लेकिन संदर्भों की तुलना करता है! यह मुझे आश्चर्य नहीं करेगा अगर एक या दो दशक में, यह विचार है कि == संस्कृति-निर्भर मानक बन गया है।

मैं आज सुबह थोड़ा अजीब में भाग गया और सोचा कि मैं इसे टिप्पणी के लिए जमा कर दूंगा।

क्या कोई यह बता सकता है कि SQL 2008 के विरुद्ध चलाए जाने पर निम्न SQL क्वेरी प्रिंट 'बराबर' क्यों होती है। डीबी संगतता स्तर 100 पर सेट होता है।

if '' = ' '
    print 'equal'
else
    print 'not equal'

और यह 0 देता है:

select (LEN(' '))

ऐसा लगता है कि अंतरिक्ष को ऑटो ट्रिम कर रहा है। मुझे नहीं पता कि यह SQL सर्वर के पिछले संस्करणों में मामला था, और अब मेरे पास इसका परीक्षण करने के लिए कोई भी आसपास नहीं है।

मैं इसमें भाग गया क्योंकि एक उत्पादन क्वेरी गलत परिणाम लौट रही थी। मुझे यह व्यवहार कहीं भी दस्तावेज नहीं मिला है।

क्या इस पर किसी के पास कोई सूचना है?


Answer #1

एसक्यूएल सर्वर पर फ़ील्ड char / varchar के साथ चयन पर अलग-अलग रिकॉर्ड कैसे करें: उदाहरण:

declare @mayvar as varchar(10)

set @mayvar = 'data '

select mykey, myfield from mytable where myfield = @mayvar

अपेक्षित होना

माईकी (int) | माईफील्ड (वर्कर 10)

1 | 'डेटा '

प्राप्त

माईकी | मेरा क्षेत्र

1 | 'डेटा' 2 | 'डेटा '

यहां तक ​​कि अगर मैं अपने select mykey, myfield from mytable where myfield = 'data' (अंतिम खाली के बिना) मुझे एक ही परिणाम मिलते हैं।

मैंने कैसे हल किया? इस मोड में:

select mykey, myfield
from mytable
where myfield = @mayvar 
and DATALENGTH(isnull(myfield,'')) = DATALENGTH(@mayvar)

और यदि मेरे क्षेत्र में एक इंडेक्स है, तो इसका इस्तेमाल प्रत्येक मामले में किया जाएगा।

मुझे आशा है कि यह सहायक होगा।


Answer #2

किसी मूल्य को एक शाब्दिक स्थान से तुलना करने के लिए, आप इस तकनीक का उपयोग LIKE कथन के विकल्प के रूप में भी कर सकते हैं:

IF ASCII('') = 32 PRINT 'equal' ELSE PRINT 'not equal'

Answer #3

कुछ समय पहले एक समान सवाल था जहां मैंने here एक समान समस्या here

LEN ('') के बजाय, DATALENGTH ('') का उपयोग करें - जो आपको सही मान देता है।

समाधानों को एक LIKE खंड का उपयोग करना था जैसा कि मेरे उत्तर में बताया गया है, और / या WHATE क्लॉज में दूसरी स्थिति भी शामिल है ताकि DATALENGTH भी जांच सके।

वहां उस प्रश्न और लिंक का एक पठन है।


Answer #4

varchar एस और समानता टीएसक्यूएल में कांटेदार हैं। LEN समारोह कहता है:

पिछली स्ट्रिंग अभिव्यक्ति के बाइट्स की संख्या के बजाय, पीछे की रिक्त स्थान को छोड़कर वर्णों की संख्या देता है।

प्रश्न में डेटा की एक वास्तविक byte गिनती प्राप्त करने के लिए आपको DATALENGTH का उपयोग करने की आवश्यकता है। यदि आपके पास यूनिकोड डेटा है, तो ध्यान दें कि इस स्थिति में आपको जो मूल्य मिलता है वह पाठ की लंबाई के समान नहीं होगा।

print(DATALENGTH(' ')) --1
print(LEN(' '))        --0

जब अभिव्यक्ति की समानता की बात आती है, तो दोनों तारों की समानता के लिए तुलना की जाती है:

  • छोटी स्ट्रिंग प्राप्त करें
  • लंबाई तक रिक्त स्थान के साथ पैड लंबे स्ट्रिंग के बराबर है
  • दोनों की तुलना करें

यह मध्य चरण है जो अप्रत्याशित परिणाम पैदा कर रहा है - उस चरण के बाद, आप प्रभावी ढंग से व्हाइटस्पेस के खिलाफ सफेद जगह की तुलना कर रहे हैं - इसलिए उन्हें बराबर माना जाता है।

LIKE "रिक्त स्थान" स्थिति में = से बेहतर व्यवहार करता है क्योंकि यह उस पैटर्न पर रिक्त-पैडिंग नहीं करता है जिसे आप मिलान करने का प्रयास कर रहे थे:

if '' = ' '
print 'eq'
else
print 'ne'

जबकि eq दे देंगे:

if '' LIKE ' '
print 'eq'
else
print 'ne'

ne दे देंगे

हालांकि इस LIKE सावधान रहें: यह सममित नहीं है: यह पैटर्न (आरएचएस) में महत्वपूर्ण रूप से पिछली सफेद जगह का इलाज करता है लेकिन मैच अभिव्यक्ति (एलएचएस) नहीं। निम्नलिखित here से लिया गया here :

declare @Space nvarchar(10)
declare @Space2 nvarchar(10)

set @Space = ''
set @Space2 = ' '

if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'

if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'

@Space Not Like @Space2
@Space2 Like @Space




datalength