NULL का उपयोग कब करें और खाली स्ट्रिंग का उपयोग कब करें?


82

मुझे मुख्य रूप से MySQL और PostgreSQL में दिलचस्पी है, लेकिन आप सामान्य रूप से निम्नलिखित उत्तर दे सकते हैं:

  • क्या कोई तार्किक परिदृश्य है जिसमें NULL से खाली स्ट्रिंग को अलग करना उपयोगी होगा?
  • एक खाली स्ट्रिंग के भंडारण के लिए भौतिक संग्रहण निहितार्थ क्या होगा ...

    • शून्य?
    • खाली स्ट्रिंग?
    • एक और क्षेत्र?
    • कोई और विकल्प?

जवाबों:


67

मान लीजिए कि रिकॉर्ड एक रूप से नाम और पते की जानकारी इकट्ठा करने के लिए आता है। यदि उपयोगकर्ता अपार्टमेंट में नहीं रहता है तो पते की लाइन 2 आम तौर पर रिक्त होगी। इस मामले में एक खाली स्ट्रिंग पूरी तरह से मान्य है। मैं NULL का उपयोग इस बात के लिए करना पसंद करता हूं कि मूल्य अज्ञात है या नहीं दिया गया है।

मुझे विश्वास नहीं है कि भौतिक भंडारण अंतर अभ्यास के बारे में चिंता करने योग्य है। डेटाबेस प्रशासक के रूप में, हमारे पास तलने के लिए बहुत बड़ी मछली है!


2
+1 बहुत कम डीबीए का उपयोग करने की गति / आकार के अंतर के बारे में चिंता करने की आवश्यकता है NULLया नहीं
पैट्रिक

28
सहमत ... मैं NULL को 'ज्ञात नहीं' के लिए आरक्षित करने का प्रयास करता हूं ... खाली स्ट्रिंग है 'हम जानते हैं कि इसे खाली होना चाहिए'। जब आपका डेटा कई स्रोतों से आता है, तो यह विशेष रूप से उपयोगी है
जो

6
बकाया - NULL ज्ञात नहीं है, खाली स्ट्रिंग निर्दिष्ट किया गया था।
स्कॉटकर

@ लॉरी प्रदर्शन प्रभाव क्या है? कई पंक्तियों बनाम कई पंक्तियों की तालिकाओं के साथ प्रदर्शन अलग-अलग कैसे होता है?
शिम्मी

मैं सहमत हूं कि यदि आपके डेटासेट में कोई मान नहीं दिया गया है और एक खाली स्ट्रिंग है, तो आप उन्हें उचित रूप से उपयोग करना चाहिए, लेकिन व्यक्तिगत रूप से अगर मुझे अपने डेटा के साथ उस अंतर की आवश्यकता नहीं है, तो मैं हमेशा एक खाली स्ट्रिंग का उपयोग करता हूं, विशुद्ध रूप से क्योंकि मैं कमांड लाइन पर एक MySQL क्लाइंट से क्वेरी परिणाम को NULL के बहुत सारे बजाय खाली तारों के साथ देखने के लिए क्लीनर हो सकता है
RTF

25

मैं MySQL और PostgreSQL के बारे में नहीं जानता, लेकिन मुझे इसका इलाज आमतौर पर करना चाहिए।

एक डीबीएमएस है जिसका नाम है ओरेकल, जो इसे NULL और '' के बीच के उपयोगकर्ताओं को चुनने की अनुमति नहीं देता है। यह स्पष्ट रूप से दर्शाता है कि दोनों के बीच अंतर करना आवश्यक नहीं है। कुछ कष्टप्रद परिणाम हैं:

आप varchar2 को इस तरह एक खाली स्ट्रिंग पर सेट करते हैं:

Update mytable set varchar_col = '';

निम्नलिखित उसी परिणाम की ओर जाता है

Update mytable set varchar_col = NULL;

लेकिन उन स्तंभों का चयन करने के लिए जहां मान रिक्त है या NULL, आपको उपयोग करना होगा

select * from mytable where varchar_col is NULL;

का उपयोग करते हुए

select * from mytable where varchar_col = '';

वाक्यात्मक रूप से सही है, लेकिन यह कभी एक पंक्ति नहीं लौटाता है।

दूसरी ओर, जब ओरेकल में स्ट्रैटनिंग स्ट्रिंग्स। खाली वर्कशॉप को खाली तारों के रूप में माना जाता है।

select NULL || 'abc' from DUAL;

पैदावार abc । अन्य DBMS इन मामलों में NULL लौटा देंगे।

जब आप स्पष्ट रूप से व्यक्त करना चाहते हैं, तो एक मान असाइन किया गया है, आपको '' जैसे कुछ का उपयोग करना होगा।

और आपको चिंता करनी होगी कि क्या ट्रिमिंग नेल में खाली परिणाम नहीं है

select case when ltrim(' ') is null then 'null' else 'not null' end from dual

ऐसा होता है।

अब DBMS को देखना जहाँ '' NULL (जैसे SQL- सर्वर) के समान नहीं है

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



17

यह उस डोमेन पर निर्भर करता है जिस पर आप काम कर रहे हैं। NULLका अर्थ है मान का अभाव (अर्थात कोई मूल्य नहीं है ), जबकि खाली स्ट्रिंग का मतलब शून्य लंबाई का एक स्ट्रिंग मान है।

उदाहरण के लिए, मान लें कि आपके पास किसी व्यक्ति के डेटा को संग्रहीत करने के लिए एक तालिका है और इसमें एक Genderकॉलम है। आप मूल्यों को 'पुरुष' या 'महिला' के रूप में सहेज सकते हैं। यदि उपयोगकर्ता लिंग डेटा प्रदान नहीं करने का चयन करने में सक्षम है, तो आपको इसे सहेजना चाहिए NULL(जैसे कि उपयोगकर्ता ने मूल्य प्रदान नहीं किया है) और खाली स्ट्रिंग नहीं है (क्योंकि मूल्य '' के साथ कोई लिंग नहीं है)।


7
यदि उपयोगकर्ता ने लिंग प्रदान करने के लिए नहीं चुना है, तो निश्चित रूप से आपको "प्रदान करने के लिए अस्वीकृत" स्टोर करना चाहिए। NULL अस्पष्ट है; इसका अर्थ यह भी हो सकता है "ग्राहक से पूछा नहीं गया है", "ग्राहक हमारी सूची में नहीं लिंग के साथ की पहचान करता है", आदि।
जॉन ऑफ ऑल ट्रेड्स

8

एक बात ध्यान में रखने योग्य है कि जब आपके पास एक ऐसा क्षेत्र है जिसकी आवश्यकता नहीं है, लेकिन जो भी मूल्य मौजूद हैं वे अद्वितीय होने चाहिए, आपको खाली मानों को NULL के रूप में संग्रहीत करना होगा। अन्यथा, आप केवल उस क्षेत्र में एक खाली मान के साथ एक टपल कर पाएंगे।

संबंधपरक बीजगणित और NULL मानों के साथ कुछ अंतर भी हैं: उदाहरण के लिए NULL! = NULL।


4
यह वास्तव में ऐसा नहीं है कि NULL! = NULL, क्योंकि यह NULL है। ;-)
पीटर आइज़ेंट्राट

1
ध्यान दें कि MS SQL इस नियम का पालन नहीं करता है: कई NULL मान एक UNIQUEबाधा का उल्लंघन करेंगे । सौभाग्य से, 2008 से शुरू करके आप उचित व्यवहार प्राप्त करने के लिए फ़िल्टर किए गए सूचकांक का उपयोग कर सकते हैं।
जॉन ऑफ ऑल ट्रेड्स

6

आप NULL की डेट समालोचना और SQL में 3VL और समसामयिक थ्योरी (और रुबिनसन की समालोचना की तारीख समालोचना, नल, थ्री-वैल्यूड लॉजिक और SQL में Ambiguity: क्रिटिकिंग डेट की समालोचना) में भी कारक हो सकते हैं ।

दोनों को संबंधित SO थ्रेड में लंबाई पर संदर्भित और चर्चा की जाती है, DB मॉडल से NULLable कॉलम को समाप्त करने के लिए विकल्प


4

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

यदि आप एक फ्रेमवर्क का उपयोग नहीं कर रहे हैं या यदि आप सरल एसक्यूएल स्टेटमेंट और प्रोसेसिंग का उपयोग कर रहे हैं, तो मैं आपको जिस भी विकल्प के साथ ट्रैक करना आसान है, के साथ जाना चाहूंगा। मैं आम तौर पर NULL को पसंद करता हूं ताकि INSERTबयान करना खाली खेतों को सेट करने के लिए भूलने के साथ थकाऊ न हो NULL


सवाल NULL बनाम खाली स्ट्रिंग (एक अशक्त स्तंभ, IMO) के बारे में है, नहीं NULL बनाम NOT NULL, है ना?
गण

भंडारण के बारे में पूछने वाले सवाल का हिस्सा मुझे यह सोचने के लिए प्रेरित करता है कि वह नल / नहीं नल के बारे में भी सोच सकता है
पैट्रिक

या @ बाकी सब के संबंध में NULL vs NOT NULL के निहितार्थ के बारे में, आप इसका उल्लेख कर सकते हैं: dba.stackexchange.com/q/63/107
गण

2

ओरेकल के साथ काम करना ( जो आपको अंतर करने की अनुमति नहीं देता है ) मैं निम्नलिखित निष्कर्ष पर आया हूं:

  • एक तार्किक पीओवी से यह कोई फर्क नहीं पड़ता। मैं वास्तव में एक सम्मोहक उदाहरण के बारे में नहीं सोच सकता, जहां NULL और शून्य-लंबाई-स्ट्रिंग के बीच अंतर DBMS में किसी भी मूल्य को जोड़ता है।

  • जो इस प्रकार है: आपके पास या तो एक NULLसक्षम स्तंभ है जो शून्य-लेन ''(ओरेकल-ईश समाधान) की अनुमति नहीं देता है या एक NOT NULLस्तंभ जो शून्य-लेन की अनुमति देता है।

  • और मेरे अनुभव से, ''बनाता है एक बहुत कड़ी, तुलना, आदि: अधिक भावना जब डेटा संसाधित, सामान्य रूप से के रूप में आप रिक्त स्ट्रिंग के रूप में एक स्ट्रिंग के अभाव की प्रक्रिया चाहते हैं

नोट: मेरे ओरेकल अनुभव पर वापस जाने के लिए: कहो कि आप खोज अनुरोध के लिए एक क्वेरी उत्पन्न करना चाहते हैं। यदि आप उपयोग करते हैं ''तो आप बस उत्पन्न कर सकते हैं WHERE columnX = <searchvalue>और यह समानता खोजों के लिए काम करेगा। यदि आप उपयोग करते NULLहैं तो आपको करना होगा WHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)। बाह! :-)


2

वे एक डिजाइन के नजरिए से भी अलग हैं:

जैसे

CREATE TABLE t (
    id INTEGER  NOT NULL,
    name CHARACTER(40),
    CONSTRAINT t_PK PRIMARY KEY (id)
);

CREATE UNIQUE INDEX t_AK1 ON t (name);

जैसा दिखता है:

 \d t
          Table "public.t"
 Column |     Type      | Modifiers
--------+---------------+-----------
 id     | integer       | not null
 name   | character(40) |
Indexes:
    "t_pk" PRIMARY KEY, btree (id)
    "t_ak1" UNIQUE, btree (name)

कुछ डेटा डालें:

op=# insert into t(id, name ) values ( 1, 'Hello');
INSERT 0 1

op=# insert into t( id, name) values ( 2, '');
INSERT 0 1

op=# insert into t( id, name) values ( 3, '');

ERROR:  duplicate key value violates unique constraint "t_ak1"

अब अशक्त के साथ कोशिश करते हैं:

op=# insert into t( id, name) values (4, null );

INSERT 0 1

op=# insert into t( id, name) values (5, null);

INSERT 0 1

इसकी अनुमति है।

Soooooo: नल तुच्छ तार नहीं हैं और न ही रिवर्स।

चियर्स


1

अगर हम सिद्धांत के बारे में बात करते हैं, तो कोडड के नियम कहते हैं कि RDBMS को इलाज करना चाहिए NULL एक विशेष तरीके से मूल्यों का ।

वास्तविक डोमेन - कार्य - परियोजना - अनुप्रयोग - क्षेत्र के आधार पर, डेटाबेस आर्किटेक्ट्स तक इसका उपयोग कैसे किया जाता है।

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