2012-02-25 19 views

उत्तर

8

NULL विशेष डेटा प्रकार, यह मूल्य की अनुपस्थिति का मतलब है।

दूसरी ओर एक खाली स्ट्रिंग का अर्थ है एक स्ट्रिंग या मान जो खाली है।

दोनों अलग हैं।

उदाहरण के लिए, यदि आपके पास तालिका में name फ़ील्ड है और डिफ़ॉल्ट रूप से आपने इसे NULL पर सेट कर दिया है। जब इसके लिए कोई मान निर्दिष्ट नहीं किया गया है, तो यह NULL होगा लेकिन यदि आप वास्तविक नाम या खाली स्ट्रिंग निर्दिष्ट करते हैं, तो यह NULL नहीं होगा, इसके बजाय इसमें एक खाली स्ट्रिंग होगी।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। क्या आप उदाहरण के साथ समझा सकते हैं? – user873779

+0

@ user873779: मैंने अपने उत्तर में एक उदाहरण दिया है लेकिन जब आप इसे आज़माते हैं तो इसे सबसे अच्छी तरह समझा जा सकता है। एक टेबल बनाएं, इसमें एक फ़ील्ड बनाएं, अपना डिफ़ॉल्ट मान 'NULL' पर सेट करें। इसके लिए दो रिकॉर्ड्स बनाएं, जिनमें कोई डेटा नहीं है जैसे 'न्यूल' और एक खाली स्ट्रिंग वाला और अपनी क्वेरी चलाएं। – Sarfraz

+2

बस एक मामूली सुधार: 'NULL' डेटा प्रकार नहीं है। –

2

शून्य का मतलब मूल्य याद आ रही है लेकिन '' का मतलब मूल्य वहाँ लेकिन सिर्फ रिक्त स्ट्रिंग तो पहली क्वेरी क्वेरी सभी पंक्तियां मूल्य कर्नल लापता नहीं है इसका मतलब है, दूसरा एक उन पंक्तियों को नहीं कर्नल चयन का मतलब रिक्त स्ट्रिंग

के बराबर होती है

अद्यतन

अधिक जानकारी के लिए, मैं सुझाव है कि आप यह लेख पढ़ें:

http://sqlblog.com/blogs/hugo_kornelis/archive/2007/07/05/null-ndash-the-database-rsquo-s-black-hole.aspx

1

Select * from table where col IS NOT NULL वापसी होगी resu Select * from table where col <> ‘’ से एलटीएस को छोड़ दिया गया क्योंकि एक खाली स्ट्रिंग भी नहीं है।

+0

धन्यवाद। क्या आप उदाहरण के साथ समझा सकते हैं? – user873779

0

http://data.stackexchange.com/stackoverflow/query/62491/http-stackoverflow-com-questions-9444638-null-vs-empty-in-sql-server

SET NOCOUNT ON; 
DECLARE @tbl AS TABLE (value varchar(50) NULL, description varchar(50) NOT NULL); 

INSERT INTO @tbl VALUES (NULL, 'A Null'), ('', 'Empty String'), ('Some Text', 'A non-empty string'); 

SELECT * FROM @tbl; 
SELECT * FROM @tbl WHERE value IS NOT NULL; 
SELECT * FROM @tbl WHERE value <> ''; 

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

5

NULL मूल्य का अभाव है, और आमतौर पर इस तरह के अज्ञात या नहीं (अभी तक) निर्धारित किया गया है कुछ सार्थक, इंगित करता है। उदाहरण के लिए, अगर मैं आज एक परियोजना शुरू करता हूं, तो StartDate2012-02-25 है। अगर मुझे नहीं पता कि परियोजना कब तक जा रही है, तो EndDate क्या होना चाहिए? मुझे कुछ विचार हो सकता है कि ProjectedEndDate क्या हो सकता है, लेकिन मैं EndDate को NULL पर सेट कर दूंगा, और प्रोजेक्ट पूरा होने पर इसे अपडेट कर सकता हूं।

'' एक शून्य लंबाई (या "खाली") स्ट्रिंग है। यह तकनीकी रूप से डेटा की अनुपस्थिति नहीं है, क्योंकि यह वास्तव में सार्थक हो सकता है। उदाहरण के लिए, यदि मेरे पास मध्य डेटा नहीं है, तो आपके डेटा मॉडल '' के आधार पर NULL से अधिक समझ हो सकती है क्योंकि उत्तरार्द्ध अज्ञात का तात्पर्य है लेकिन '' यह इंगित कर सकता है कि यह ज्ञात है कि मेरे पास कोई नहीं है। NULL का उपयोग उसी तरह किया जा सकता है, लेकिन फिर यह समझना मुश्किल है कि यह ज्ञात नहीं है कि यह अस्तित्व में है या नहीं, या यह ज्ञात है कि यह अस्तित्व में नहीं है।बहुत से मानकों के लिए उन चीज़ों के लिए समर्पित मूल्य होते हैं जहां यह ज्ञात नहीं हो सकता है - उदाहरण के लिए Gender मुझे 9 अलग-अलग वर्ण कोड मानते हैं ताकि M या F निर्दिष्ट नहीं हैं, हम हमेशा जानते हैं कि क्यों (अज्ञात, निर्दिष्ट नहीं, ट्रांसजेंडर, आदि) । उस मामले के बारे में भी सोचें जहां HeartRateNULL है - क्या ऐसा इसलिए है क्योंकि कोई नाड़ी नहीं थी, या क्योंकि हमने इसे अभी तक नहीं लिया है?

वे समान नहीं हैं, हालांकि दुर्भाग्य से कई लोग उनका इलाज करते हैं। यदि आपका कॉलम NULL की अनुमति देता है तो इसका मतलब है कि आप पहले से जानते हैं कि कभी-कभी आपको यह जानकारी नहीं पता हो। यदि आप उन्हें एक ही चीज़ के रूप में नहीं मान रहे हैं, तो आपके प्रश्न अलग-अलग होंगे। उदाहरण के लिए यदि colNULL की अनुमति नहीं देता है, तो आपकी पहली क्वेरी हमेशा तालिका में सभी परिणाम लौटाएगी, क्योंकि उनमें से कोई भी NULL नहीं हो सकता है। हालांकि NOT NULL अभी भी एक खाली स्ट्रिंग को तब तक दर्ज करने की अनुमति देता है जब तक कि आपने शून्य-लंबाई तारों को रोकने के लिए चेक बाधा भी सेट नहीं की हो।

एक ही कॉलम के लिए दोनों को अनुमति देना आम तौर पर डेटा मॉडल को समझने की कोशिश करने वाले किसी के लिए थोड़ा उलझन में है, हालांकि मुझे लगता है कि ज्यादातर मामलों में NOT NULL बाधा LEN(col)>0 चेक बाधा के साथ संयुक्त नहीं है। समस्या दोनों को अनुमति दी जाती है कि यह जानना मुश्किल है कि कॉलम NULL है या कॉलम "खाली" है - वे एक ही चीज़ का मतलब हो सकता है, लेकिन वे नहीं कर सकते - और यह दुकान से अलग हो जाएगा दुकान।

एक अन्य महत्वपूर्ण बात यह है कि NULL किसी भी चीज़ की तुलना में कम से कम (SQL सर्वर * में डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से) अज्ञात का मूल्यांकन करता है, जो बदले में गलत का मूल्यांकन करता है। उदाहरण के लिए, इन प्रश्नों सभी वापसी 0:

DECLARE @x TABLE(i INT); 
INSERT @x VALUES(NULL); 

SELECT COUNT(*) FROM @x WHERE i = 1; 
SELECT COUNT(*) FROM @x WHERE i <> 1; 
SELECT COUNT(*) FROM @x WHERE i <= 3; 
SELECT COUNT(*) FROM @x WHERE i > 3; 
SELECT COUNT(*) FROM @x WHERE i IN (1,2,3); 
SELECT COUNT(*) FROM @x WHERE i NOT IN (1,2,3); 

जहां खंड हमेशा अज्ञात के रूप में मूल्यांकित में तुलना के बाद से, वे हमेशा वापस झूठी आते हैं, इसलिए यदि कोई भी पंक्ति कभी मानदंडों को पूरा करने और सभी की गिनती के वापस आने के रूप में 0

इसके अलावा, dba.stackexchange पर इस सवाल का जवाब उपयोगी हो सकता है:

https://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls

* आप SET ANSI_NULLS OFF का उपयोग करके यह बदल सकते हैं - लेकिन इस दोनों की सलाह नहीं दी है क्योंकि यह गैर मानक प्रदान करता है व्यवहार और क्योंकि यह "फीचर" has been deprecated since SQL Server 2005 और SQL सर्वर के भविष्य के संस्करण में नो-ऑप बन जाएगा। लेकिन आप ऊपर दिए गए प्रश्न के साथ खेल सकते हैं और देख सकते हैं कि NOT INSET ANSI_NULLS OFF के साथ अलग-अलग व्यवहार करता है।

+0

हार्ट राइट उदाहरण स्पॉट पर है। – Alper

0

जैसा कि अन्य उत्तरों में बताया गया है, NULL का अर्थ है 'कोई मान नहीं' जबकि खाली स्ट्रिंग '' का मतलब है कि खाली स्ट्रिंग। आप उन क्षेत्रों के बारे में सोच सकते हैं जो NULLs को वैकल्पिक फ़ील्ड के रूप में अनुमति देते हैं - उन्हें अनदेखा किया जा सकता है और उनके लिए मूल्य प्रदान नहीं किया जा सकता है।

एक ऐसे एप्लिकेशन की कल्पना करें जहां उत्तरदाता अपना शीर्षक चुनता है (श्रीमान, श्रीमान, मिस, डॉ।) लेकिन आपको उनमें से किसी का चयन करने और उसे खाली छोड़ने की आवश्यकता नहीं है। इस मामले में आप न्यूल को प्रासंगिक डेटाबेस फ़ील्ड में डाल देंगे।

NULL और खाली स्ट्रिंग के बीच भेद स्पष्ट नहीं हो सकता है क्योंकि यदि आप निर्णय लेते हैं तो दोनों का मतलब 'कोई मूल्य' नहीं हो सकता है। यह पूरी तरह से आपके ऊपर निर्भर करता है लेकिन NULL का उपयोग करना बेहतर होगा क्योंकि यह डेटाबेस के लिए एक विशेष मामला है जिसे एनयूएलएल को जल्दी और कुशलता से संभालने के लिए डिज़ाइन किया गया है (तारों से बहुत तेज़)।यदि आप रिक्त स्ट्रिंग के बजाय इसका उपयोग करते हैं तो आपके प्रश्न तेज और अधिक विश्वसनीय होंगे।

संबंधित मुद्दे