2008-10-15 8 views
192

मुझे पता है कि यह करता है 'NULL के रूप में' पर विचार करें, लेकिन मुझे क्यों कहना है कि यह मामला है। जैसा कि मैं एसक्यूएल विनिर्देशों को समझता हूं, '' NULL जैसा नहीं है - एक वैध डेटाम है, और दूसरा उसी जानकारी की अनुपस्थिति का संकेत दे रहा है।ओरेकल 9i एक खाली स्ट्रिंग को न्यूल के रूप में क्यों मानता है?

अनुमान लगाने के लिए स्वतंत्र महसूस करें, लेकिन कृपया यह इंगित करें कि क्या यह मामला है। अगर ओरेकल से कोई भी है जो इस पर टिप्पणी कर सकता है, तो यह शानदार होगा!

+7

अनुमान लगाने के लिए स्वतंत्र महसूस करें? किसी तरह मुझे नहीं लगता कि कि उत्तर की सबसे बड़ी सेट के साथ प्रदान करेगा .. – SCdF

+1

मुझे नहीं लगता है, लेकिन मुझे यकीन है कि इस विषय पर कोई निश्चित वहाँ होगा नहीं था, इसलिए मैं सोचा मैं दरवाजे खोल फेंक चाहते हैं। ऐसा लगता है कि अभी तक ठीक काम किया है। –

+0

http://docs.oracle.com/database/121/SQLRF/sql_elements005.htm#SQLRF51094 – Jayan

उत्तर

199

मेरा मानना ​​है कि इस सवाल का जवाब है जो कि Oracle बहुत, बहुत पुराना है।

पुराने दिनों पहले वहाँ एक एसक्यूएल मानक था में वापस, ओरेकल डिजाइन निर्णय है कि VARCHAR/VARCHAR2 स्तंभों में रिक्त स्ट्रिंग थे NULL बना दिया है और शून्य का केवल एक भावना नहीं थी (वहाँ रिलेशनल सिद्धांतकारों कि डेटा के बीच अंतर होता हैं जिसे कभी भी संकेत नहीं दिया गया है, जहां डेटा मौजूद है लेकिन उपयोगकर्ता द्वारा ज्ञात नहीं है, जहां कोई जवाब नहीं है, आदि। जिनमें से सभी NULL की भावना का गठन करते हैं)।

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

ओरेकल संभावना है कि VARCHAR डेटा प्रकार एसक्यूएल मानक का पालन करने के लिए एक भविष्य के रिलीज में बदल जाएगा (जिसके कारण हर कोई Oracle में VARCHAR2 का उपयोग करता है के बाद से है कि डेटा प्रकार के व्यवहार की गारंटी है एक ही आगे बढ़ते हुए रहने के लिए) खुला छोड़ दिया है । ओरेकल के

-6

दरअसल, मैं Oracle के साथ काम कर, अवैध datetime मान सहित लेकिन कठिनाइयों कुछ भी नहीं पड़ा है (मुद्रित नहीं किया जा सकता, परिवर्तित या कुछ भी, बस DUMP() फ़ंक्शन के साथ को देखा) जो अनुमति हैं में सम्मिलित करने के डाटाबेस, स्पष्ट रूप से क्लाइंट के कुछ बग्गी संस्करण के माध्यम से बाइनरी कॉलम के रूप में! डेटाबेस अखंडता की सुरक्षा के लिए बहुत कुछ!

ओरेकल NULLs लिंक की हैंडलिंग:

http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/

http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html

+1

अमान्य डेटाटाइम मान? उसके अर्थ के बारे में सुनिश्चित रूप से नहीं पता है। तुमसे एक सवाल यहाँ के रूप में इस पोस्ट है? –

+1

समस्या पूर्व दिनांकित stackoverflow - मैं Oracle मंचों से कोई उपयोगी जानकारी मिल गया और मैं एक समाधान बनाया - मैं अपने नोट्स पर नज़र रखने और यहाँ पोस्ट करेंगे। –

+0

यहां एक प्रश्न के रूप में विवरण पोस्ट किया गया। –

56

Tom Kyte उपाध्यक्ष:

एक शून्य लंबाई varchar शून्य माना जाता है।

'' को न्यूल के रूप में नहीं माना जाता है।

'' जब एक char (1) को सौंपा गया है तो '(चार प्रकार खाली हैं तार)।

'' जो एक शून्य लम्बाई स्ट्रिंग और एक शून्य लंबाई स्ट्रिंग है 'जब एक varchar2 (1) हो जाता है करने के लिए आवंटित' Oracle में शून्य है (यह कोई लंबी है '')

+15

वाह, टॉम की सुंदर snarky। यह देखते हुए कि सवाल SQL92 से गंभीर विचलन से संबंधित हैं, तो आप लगता है कि वह इसके बारे में कम असरदार होगा ... हालांकि वह जवाब देने के थक गया हो सकता है। –

+7

टॉम के बारे में सबसे अच्छी बात यह है कि आपको एक स्पष्ट उत्तर मिलता है, जो ** ** ** कहता है कि वह क्या सोचता है। उन टिप्पणियों की तलाश करें जहां लोगों ने टेक्स्ट टॉम –

+8

पर टेक्स्ट का उपयोग किया है, लेकिन यह दूसरी सटीक होगी यदि दूसरी पंक्ति को * '' में बदल दिया गया है ** ** ** ** ** को न्यूल के रूप में माना जाता है। * –

16

ओरेकल प्रलेखन इस समस्या का डेवलपर्स अलर्ट, संस्करण 7. के रूप में कम से कम जहाँ तक वापस जा

ओरेकल "असंभव मूल्य" तकनीक द्वारा NULLS प्रतिनिधित्व करने के लिए चुना है। उदाहरण के लिए, एक संख्यात्मक स्थान में एक नल "शून्य शून्य" के रूप में संग्रहीत किया जाएगा, एक असंभव मूल्य। कम्प्यूटेशंस से होने वाले किसी भी शून्य शून्य को संग्रहित होने से पहले सकारात्मक शून्य में परिवर्तित कर दिया जाएगा।

ओरेकल भी लंबाई शून्य की VARCHAR स्ट्रिंग (रिक्त स्ट्रिंग) एक असंभव मूल्य है, और शून्य का प्रतिनिधित्व करने के लिए एक उपयुक्त विकल्प पर विचार करने का फैसला किया, ग़लती से,। यह पता चला है कि खाली स्ट्रिंग एक असंभव मूल्य से बहुत दूर है। स्ट्रिंग कॉन्सटेनेशन के संचालन के तहत यह पहचान भी है!

ओरेकल दस्तावेज डेटाबेस डिजाइनरों और डेवलपर्स को चेतावनी देता है कि ओरेकल का कुछ भविष्य संस्करण खाली स्ट्रिंग और न्यूल के बीच इस संबंध को तोड़ सकता है, और उस संगठन पर निर्भर किसी भी कोड को तोड़ सकता है।

असंभव मान के अलावा अन्य ध्वज NULLS करने के लिए तकनीकों हैं, लेकिन ओरेकल उन्हें इस्तेमाल नहीं किया था।

(मैं शब्द "स्थान" ऊपर का उपयोग कर रहा एक पंक्ति और एक कॉलम के चौराहे मतलब करने के लिए।)

18

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

+5

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

1

क्योंकि यह शून्य के रूप में व्यवहार नहीं कर विशेष रूप से उपयोगी है, या तो नहीं है।

आप ओरेकल पर इस क्षेत्र में एक गलती करते हैं, तो आप आमतौर से ठीक उसी पर ध्यान दें। SQL सर्वर में, हालांकि, यह काम करने के लिए प्रतीत होता है, और समस्या तब प्रकट होती है जब कोई NULL की बजाय खाली स्ट्रिंग में प्रवेश करता है (शायद एक .NET क्लाइंट लाइब्रेरी से, जहां शून्य "" से अलग है, लेकिन आप आमतौर पर उन्हें समान व्यवहार करते हैं)।

मैं यह नहीं कह रहा हूँ ओरेकल ठीक है, लेकिन मुझे लगता है कि दोनों तरीकों से लगभग समान रूप से खराब कर रहे हैं।

+2

अधिक, डीबग करने के लिए बहुत आसान है। साथ ही, यदि आप स्क्रीन पर खाली सेल या इनपुट देखते हैं, तो आप जानते हैं कि डीबी में डेटा शून्य है। अन्य डीबी में जहां '' <> नल, यदि डेटा शून्य या '' है, तो आप "देख नहीं सकते", इससे बहुत चुस्त बग की ओर जाता है। '' = शून्य यह सबसे अच्छा विकल्प है, भले ही यह मानक न हो। –

+0

"अन्य डीबी में जहां '' <> नल, यदि डेटा शून्य है या '' '=> आमतौर पर, डीबी उपकरण रिक्त तारों से अलग-अलग एनयूएलएल प्रदर्शित करते हैं तो आप" देख नहीं सकते "। असल में, ओरेकल एसक्यूएल डेवलपर भी एनयूएलएस को "(शून्य)" के रूप में दिखाता है। मुझे लगता है कि यह व्हाइट को व्हाइटस्पेस से अलग करना है, लेकिन यह न्यूल और खाली तारों के बीच के अंतर से असंबंधित है। –

-5

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

पांच या छह साल या तो पहले, अशक्त स्ट्रिंग ओरेकल द्वारा अशक्त से अलग ढंग से इलाज किया गया था। जबकि, अशक्त की तरह, अशक्त स्ट्रिंग सब कुछ करने के लिए बराबर है और सब कुछ है (जो मुझे लगता है कि अशक्त के लिए ठीक है, लेकिन नल स्ट्रिंग के लिए पूरी तरह से गलत है) से अलग, कम से कम लंबाई (शून्य स्ट्रिंग) 0 वापसी होगी, के रूप में यह बाद से अशक्त स्ट्रिंग है चाहिए था शून्य लंबाई की एक स्ट्रिंग।

वर्तमान में Oracle में, लंबाई (शून्य) अशक्त रिटर्न जो मुझे लगता है कि भला है, लेकिन लंबाई (शून्य स्ट्रिंग) भी अशक्त रिटर्न जो पूरी तरह गलत है।

मुझे समझ में नहीं आता कि उन्होंने इन 2 अलग-अलग "मूल्यों" का इलाज शुरू करने का फैसला क्यों किया। उनका मतलब अलग-अलग चीजों का है और प्रोग्रामर के पास अलग-अलग तरीकों से प्रत्येक पर अभिनय करने की क्षमता होनी चाहिए। तथ्य यह है कि उन्होंने अपनी पद्धति को बदल दिया है, मुझे बताता है कि उनके पास वास्तव में कोई संकेत नहीं है कि इन मानों का इलाज कैसे किया जाना चाहिए।

+0

उद्धरण "शून्य स्ट्रिंग" और नल मान के बीच भेद बनाने के लिए आवश्यक है। ओरेकल को छोड़कर किसी भी डेटाबेस में, 'VARCHAR' फ़ील्ड में एक मान (शून्य या अधिक वर्ण) हो सकता है या कोई मान (NULL), पूर्ण स्टॉप हो सकता है। –

3

खाली स्ट्रिंग न्यूल के समान ही है क्योंकि स्थिति की तुलना में इसकी "कम बुराई" होती है जब दो (खाली स्ट्रिंग और शून्य) समान नहीं होते हैं।

उन भाषाओं में जहां नल और खाली स्ट्रिंग समान नहीं हैं, किसी को हमेशा दोनों स्थितियों की जांच करनी होती है।

+0

बस अपने कॉलम पर 'शून्य न करें' बाधा सेट करें और केवल खाली स्ट्रिंग पर जांचें। –

+3

दोनों स्थितियों की जांच करना मामूली है: 'जहां फ़ील्ड <>' '' रिक्त सत्य के लिए एएनएसआई व्यवहार वाले डेटाबेस पर, फ़ील्ड शून्य नहीं है और खाली नहीं है, तो केवल सत्य लौटाता है। –

0

According to official 11g docs

Oracle डाटाबेस वर्तमान में अशक्त के रूप में शून्य की लंबाई के साथ एक चरित्र मूल्य व्यवहार करता है। हालांकि, भविष्य में रिलीज में यह सच नहीं हो सकता है, और ओरेकल ने सिफारिश की है कि आप खाली तारों को नल के समान नहीं मानते हैं।

करने के कारणों में

  1. val IS NOT NULL से val != ''
  2. किताब से दोनों स्थितियों val != '' and val IS NOT NULL
+3

पूरी तरह से एएनएसआई-अनुरूप डेटाबेस में, आपको दोनों स्थितियों की जांच करने की आवश्यकता नहीं है। 'वैल <> '' पहले से ही 'न्यूल' को बाहर कर दिया गया है। शायद आप 'वैल =' 'या वैल IS NULL' मतलब था। लेकिन खाली तार जो नल के रूप में तुलना नहीं करते हैं * उपयोगी * हैं! – ErikE

0

उदाहरण जाँच करने के लिए कोई ज़रूरत नहीं अधिक पठनीय है

set serveroutput on; 
    DECLARE 
    empty_varchar2 VARCHAR2(10) := ''; 
    empty_char CHAR(10) := ''; 
    BEGIN 
    IF empty_varchar2 IS NULL THEN 
    DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL'); 
    END IF; 


    IF '' IS NULL THEN 
    DBMS_OUTPUT.PUT_LINE(''''' is NULL'); 
    END IF; 

    IF empty_char IS NULL THEN 
    DBMS_OUTPUT.PUT_LINE('empty_char is NULL'); 
    ELSIF empty_char IS NOT NULL THEN 
    DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL'); 
    END IF; 

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