2009-08-12 17 views
14

जाहिर है ओरेकल खाली तारों और नल के बीच अंतर नहीं लग रहा है। जैसेओरेकल नल और खाली तारों के बीच अंतर नहीं है?

Select name from TABLE_A where id=100; 
    ID NAME 
    100 null 

Update TABLE_A set NAME='' where id=100; 
SELECT --> 
    ID NAME 
    100 null 

SELECT length(NAME) FROM TABLE_A WHERE id=100; 
    null 

मैं किसी भी अच्छा कारण ओरेकल इस तरह से (यह रूप में अच्छी तरह sqlplus में ऐसा करता है व्यवहार करने के लिए का निर्माण किया जाएगा के बारे में सोच नहीं कर सकते? एक जावा इंटरफेस के माध्यम से पहुँचने के -मैं, लेख संदर्भित इस्तेमाल किया PHP ग्राहक)।

क्या आप कम से कम 0 लंबाई को अनिर्धारित लंबाई से अलग नहीं करना चाहते हैं? क्या यह जाना पहचाना हुआ मुद्दा है? कुछ विशिष्ट उद्देश्य के लिए जानबूझकर व्यवहार? डेटाबेस सिद्धांत में एक लंबे समय से चल रहे विवाद? क्या देता है?

(यह this question को मैट Solnit के जवाब से प्रेरित किया गया था।)

+0

यह प्रश्न संबंधित के रूप में पोस्ट किया गया है, हालांकि यह "क्यों" को संबोधित नहीं करता है: http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 –

उत्तर

33

Oracle बहुत बहुत बहुत पुराना है।

80's में वापस जब यह विकसित किया गया था (और इससे पहले कि कोई मानकों थे) उन्होंने सोचा है एक अच्छा विचार था, और दिया तो जिस तरह से Oracle भंडार अपने मूल्यों, यह वास्तव में किया गया था।

alt text

नहीं डेटाप्रकार, डेटा के भीतर संग्रहीत किया जाता है केवल डेटा लंबाई और डेटा ही:

यहाँ कैसे Oracle भंडार डेटा (documentation से लिया गया) है।

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

तो मूल्य 'test', Oracle को स्टोर करने के लिए 5 बाइट्स स्टोर करने की आवश्यकता है: 04 74 65 73 74

हालांकि, एक खाली स्ट्रिंग और NULL, Oracle दोनों को स्टोर करने के लिए बस डेटा की लंबाई 0 पर सेट करने की आवश्यकता है।

बहुत ही स्मार्ट यदि आपका डेटा 20 Mb हार्ड ड्राइव पर संग्रहीत किया जाना है जो प्रत्येक 5,000$ खर्च करता है।

बाद में, जब मानक दिखाई दिए, तो अब यह इतना अच्छा विचार नहीं था, लेकिन उस समय तक पहले से ही बहुत सारे थे और बहुत सारे कोड NULL और '' पर निर्भर थे।

इस तरह के भेद करने के लिए VARCHAR बनाना टन कोड को तोड़ देगा।

इसे ठीक करने के लिए, वे VARCHAR2 को VARCHAR नाम दिया (जो किसी भी मानक का एक हिस्सा नहीं है), ने कहा कि VARCHAR2 होगा कभी नहीं एक NULL और एक खाली स्ट्रिंग के बीच अंतर है और इसके बजाय इस डेटाप्रकार उपयोग करने के लिए हर किसी का आग्रह किया।

अब वे शायद अंतिम व्यक्ति की प्रतीक्षा कर रहे हैं जिन्होंने VARCHAROracle डेटाबेस में मरने के लिए उपयोग किया था।

+0

एकमात्र कारण ऐतिहासिक है? और 25 साल के लिए तय नहीं है? यह कैसे हो सकता है, यह देखते हुए कि यह इतना खर्च करता है? ;) –

+2

लागत! = गुणवत्ता। मैंने ओरेकल का कभी भी उपयोग नहीं किया है, लेकिन कमल नोट्स देखें। उस सॉफ़्टवेयर का भी बहुत अधिक $$$ खर्च होता है, लेकिन कुछ लोग कहेंगे कि यह एक उच्च गुणवत्ता वाला एप्लिकेशन है। –

+3

+1 "अंतिम व्यक्ति को मरने की प्रतीक्षा" ... मैं बस इसे चित्रित कर सकता हूं ... –

0

ऐसा लगता है जैसे ओरेकल ने कहा है कि भविष्य में रिलीज में यह व्यवहार बदल सकता है।कब और किस रिलीज की जाएगी इसका उल्लेख नहीं किया जाएगा।

आप टिप्पणी पर Metalink नज़र में पहुंच सकते हैं: १०,११,३४०.६ (दुर्भाग्य से, क्योंकि प्रतिबंधों के मैं टिप्पणी यहाँ की सामग्री की प्रतिलिपि करने में असमर्थ हूँ)

आप Metalink के लिए पहुँच नहीं है, तो देखो देखो 10g रिलीज़ 2 प्रलेखन से निम्नलिखित here

0

@ इयान, आपको एक जवाब।

ओरेकल चलाता तालिका वे पर बनाई गई हैं देख सकते हैं:

create table t (id number(10)); 

create or replace trigger t_bir before insert on t for each row 
declare 
    l_id t.id%type; 
begin 
    select id 
    into l_id 
    from t 
    where id = :new.id; 
exception 
    when no_data_found then 
    null; 
end; 
/


SQL> insert into t values (20); 

1 row is created. 


SQL> select * from t; 

     ID 
---------- 
     20 
+0

@tuinstoel: केवल इसलिए कि आप VALUES क्लॉज का उपयोग कर रहे हैं। यदि आप INSERT SELECT पर स्विच करते हैं: एसक्यूएल> दोहरी से टी का चयन 20 में डालें; दोहरी * ERROR से टी का चयन 20 में डालें टी लाइन 1: ओआरए -040 9 1: तालिका RWIJK.T उत्परिवर्तित है, ट्रिगर/फ़ंक्शन इसे ओआरए -06512: "RWIJK.T_BIR" पर, लाइन 4 ORA-04088: ट्रिगर 'RWIJK के निष्पादन के दौरान त्रुटि। T_BIR ' –

+0

-------- मुझे पता है। – tuinstoel

1

यही वजह है की तारीख की तरह स्मार्ट लोगों का कहना है कि आप nulls का उपयोग कभी नहीं करना चाहिए।

(नहीं, मैं सटीक होना है। यह वास्तव में सिर्फ लगभग कारणों के सैकड़ों वह इस पिछले कुछ दशकों में उल्लेख किया है कि दावे के समर्थन में से एक भी नहीं। है)

संपादित

मैं वास्तव में भी इसका जवाब देना चाहता था:

"ऐसा भेद करने के लिए वचारर बनाना कोड का बहुत से टूट जाएगा।"

हाँ, और निश्चित रूप से, कम से कम "खाली स्ट्रिंग" को प्रतिस्थापित करके मानक की भावना को तोड़कर हर अद्यतन पर कम बुराई है?

(नोट: शून्य किसी भी चीज़ के बराबर नहीं है, यहां तक ​​कि खुद भी नहीं, इसलिए कॉलम में खाली स्ट्रिंग को असाइन करने के बाद, ऑरैकल आपको उस कॉलम में एक मान देगा जो वैल्यू जैसा नहीं है जैसा आपने कहा था वहां दिखाई देने के लिए। वाह 0)

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