2012-11-07 24 views
60

संभव डुप्लिकेट:
Why does Oracle 9i treat an empty string as NULL?बनाम Oracle में रिक्त स्ट्रिंग अशक्त

मैं Oracle 10g में एक तालिका केवल दो कॉलम के साथ TEMP_TABLE नामित - बस प्रदर्शन की खातिर id और description

स्तंभ id एक दृश्य उत्पन्न प्रकार NUMBER(35, 0) not null और स्तंभ DESCRIPTION की प्राथमिक कुंजी है VARCHAR2(4000) not null का एक प्रकार है।

इस मामले में मूल तालिका संरचना निम्न की तरह कुछ दिखाई देगी।

+--------------+-----------+---------------+ 
|Name   | Null?  | Type   | 
+--------------+-----------+---------------+ 
|ID   | NOT NULL | NUMBER(35) | 
|DESCRIPTION | NOT NULL | VARCHAR2(4000)| 
+--------------+-----------+---------------+ 

इस तालिका बनाने के बाद, मैं वैकल्पिक रूप से निम्नलिखित INSERT आदेशों सम्मिलित करने का प्रयास कर रहा हूँ।

INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful 
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful 

उन दोनों स्पष्ट रूप असफल क्योंकि not null बाधा DESCRIPTION स्तंभ पर लागू की जाती है कर रहे हैं।

दोनों मामलों में, ओरेकल की शिकायत

ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION") 

रिक्त स्ट्रिंग Oracle में एक NULL मूल्य माना जाता है।


अगर मैं DESCRIPTION स्तंभ पर not null बाधा गिरा तो बुनियादी तालिका संरचना निम्नलिखित

+--------------+-----------+---------------+ 
|Name   | Null?  | Type   | 
+--------------+-----------+---------------+ 
|ID   | NOT NULL | NUMBER(35) | 
|DESCRIPTION |   | VARCHAR2(4000)| 
+--------------+-----------+---------------+ 

और INSERT आदेशों के रूप में सफल होगा निर्दिष्ट के दोनों प्रकार दिखाई देगा। वे के DESCRIPTION कॉलम में एक null मान के साथ दो पंक्तियां बनाते हैं और दूसरा खाली स्ट्रिंग '' के साथ।

अब, अगर मैं निम्नलिखित SELECT आदेश जारी,

SELECT * FROM temp_table WHERE description IS NULL; 

तो यह हासिल करेगा दोनों पंक्तियों जिसमें एक एक null महत्व है और अन्य DESCRIPTION स्तंभ में कोई रिक्त स्ट्रिंग '' है।

निम्नलिखित SELECT बयान तथापि TEMP_TABLE

SELECT * FROM temp_table WHERE description=''; 

से कोई भी पंक्ति को पुन: प्राप्त यह भी पंक्ति जो DESCRIPTION स्तंभ में कोई रिक्त स्ट्रिंग है पुनः प्राप्त नहीं करता है।


मुमकिन है, ऐसा लगता है कि ओरेकल एक null मूल्य और एक खाली स्ट्रिंग '' अलग ढंग से यहाँ जो तथापि INSERT बयान है जिसमें दोनों एक null मूल्य और एक खाली स्ट्रिंग '' हैं के साथ मामला हो प्रतीत नहीं होता है व्यवहार करता है not null बाधा वाले कॉलम में डालने से रोका गया। ऐसा क्यों है?

+1

आप कैसे देखते हैं कि वर्णन फ़ील्ड में से एक में एक खाली स्ट्रिंग है और दूसरे में शून्य है? –

+0

@ फ्लैन्श- संभवतः, मैंने उन 'INSERT' कथनों के साथ माना, क्योंकि मुझे नहीं पता था कि खाली तार '' 'को' शून्य 'मानों में परिवर्तित कर दिया गया है, क्षमा करें। – Tiny

+0

आप [* यह *] (http://stackoverflow.com/a/203536/1057429) – alfasin

उत्तर

70

ऐसा इसलिए है क्योंकि ओरेकल आंतरिक रूप से खाली मूल्यों को खाली मानों में बदल देता है। ओरेकल बस एक खाली स्ट्रिंग डालने नहीं देगा।

दूसरी तरफ, SQL सर्वर आपको वह करने देगा जो आप प्राप्त करने का प्रयास कर रहे हैं।

यहां 2 कामकाज से जुड़े हैं:

  1. एक और स्तंभ जानकारी देनी होगी कि 'वर्णन' फ़ील्ड वैध है या नहीं
  2. प्रयोग करें 'वर्णन' फ़ील्ड जहां आप इसे संग्रहीत करना चाहते हैं के लिए कुछ डमी मूल्य है का उपयोग करें खाली स्ट्रिंग।

दोनों कर रहे हैं, निश्चित रूप से, बेवकूफ समाधान :)

+2

पढ़ना चाहेंगे शायद यह स्ट्रिंग के साथ या अन्य डेटाटाइप के साथ भी मामला है? – Logicalj

26

Oracle में एक खाली varchar2 और अशक्त हैं (यानी क्षेत्र होने के लिए 'stackoverflowrocks' अपने वास्तविक डेटा संभालने इस तरह के एक वर्णन मूल्य का सामना कभी नहीं होगा सेट) वही व्यवहार किया, और आपके अवलोकनों से पता चलता है।

जब आप लिखते हैं:

select * from table where a = ''; 

इसके,

select * from table where a = null; 

और नहीं a is null

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

+0

यदि आप 7.3 (जावा के बिना) और> = 8.0 (जावा के साथ) की तुलना करते हैं तो यह विशेष रूप से रूचि रखता है। –

+1

इसके अतिरिक्त, क्लॉज 'जहां नहीं (ए = '') 'भी सच नहीं है, क्योंकि' ए = ''' 'ए = नल 'है, जो' अज्ञात 'का मूल्यांकन करता है, और' नहीं (अज्ञात)' ' UnkNOWN', जो सच नहीं है। UNKNOWN के विवरण के लिए, http://stackoverflow.com/questions/2692046/how-oracle-10g-evaluates-null-in-boolean-expressions का उत्तर भी देखें –