Oracle में varchar और varchar2 में क्या अंतर है?


जवाबों:


336

अभी तक, वे पर्यायवाची हैं।

VARCHARमानक प्रिस्क्रिप्शन के रूप में भविष्य में खाली स्ट्रिंग के Oracleबीच अंतर का समर्थन करने के लिए आरक्षित है ।NULLANSI

VARCHAR2एक NULLऔर खाली स्ट्रिंग के बीच अंतर नहीं करता है , और कभी नहीं होगा।

यदि आप खाली स्ट्रिंग पर भरोसा करते हैं और NULLएक ही चीज होने के नाते, आपको उपयोग करना चाहिए VARCHAR2


40
पहले उस तर्क को नहीं सुना था, यह उपयोगी है। धन्यवाद। रिकॉर्ड के लिए, यह अभी भी पूरी तरह से हास्यास्पद है कि ओरेकल में मुख्य चरित्र प्रकार "varchar2" है। क्या यह किसी और कीचड़ के रूप में हड़ताल नहीं करता है? लगता है कि कैसे मैं अपने कार्यक्रम के सीखने के पहले सप्ताह में कुछ समस्या को हल किया होगा।
इयान वार्ले

7
@ इयान: मुख्य प्रकार है VARCHAR2क्योंकि वर्तमान में कोई ऐसा प्रकार नहीं है जो व्यवहार VARCHARकरना चाहिए। वास्तव में, आपको VARCHARतब तक उपयोग नहीं करना चाहिए जब तक कि यह ठीक से लागू न हो।
क्वासोई

11
धन्यवाद, @Quassnoi तो मुझे लगता है कि बेवकूफ हिस्सा यह है कि ओरेकल के पास हर दूसरे डेटाबेस की तरह एक उचित VARCHAR नहीं है, फिर? यहाँ कुछ बेवकूफी चल रही है, मुझे यकीन है ... :)
इयान वर्ले

11
@ इयान: जब ओरेकल विकसित किया जा रहा था, तो कोई मानक नहीं थे। जब तक मानकों का उदय हुआ तब तक इस पर पहले ही विरासत ऐप्स का बोझ था। हम सभी जानते हैं कि यह कैसे होता है।
क्वासोई

5
क्षमा करें, यह वास्तव में @UnKnown था जिसने गलत टिप्पणी लिखी थी जिसका मैं जवाब दे रहा था । इस तथ्य से कि where x is NULLविभिन्न परिणाम लौटाते हैं, इसका मतलब where x = ''यह नहीं है कि NULLऔर ''किसी भी तरह से अलग हैं। =ऑपरेटर के कारण अलग व्यवहार है ।
डैन लेन्स्की

38

वर्तमान में VARCHAR VARCHAR2 के समान ही व्यवहार करता है। हालांकि, प्रकार का VARCHARउपयोग नहीं किया जाना चाहिए क्योंकि यह भविष्य के उपयोग के लिए आरक्षित है।

से लिया गया: CHAR, VARCHAR, VARCHAR2 के बीच अंतर


@PhilipRego का VARCHARउपयोग नहीं किया जाना चाहिए। मैंने इसे संपादित किया
Bugybunny

29

नवीनतम स्थिर ओरेकल उत्पादन संस्करण 12.2 से लिया गया: डेटा प्रकार

प्रमुख अंतर यह है कि VARCHAR2एक आंतरिक डेटा प्रकार है और VARCHARएक बाहरी डेटा प्रकार है । इसलिए हमें एक आंतरिक और बाहरी डेटा प्रकार के बीच अंतर को समझने की आवश्यकता है ...

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

सामान्य तौर पर, OCI (Oracle Call Interface) एप्लिकेशन डेटा के आंतरिक डेटा प्रकार अभ्यावेदन के साथ काम नहीं करते हैं, लेकिन होस्ट भाषा डेटा प्रकारों के साथ जिस भाषा में उन्हें लिखा जाता है, वह पूर्वनिर्धारित होता है। जब डेटा को OCI क्लाइंट एप्लिकेशन और डेटाबेस टेबल के बीच स्थानांतरित किया जाता है, तो OCI लाइब्रेरी डेटा को आंतरिक डेटा प्रकार और बाहरी डेटा प्रकारों के बीच परिवर्तित करती है।

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

VARCHAR2डेटा प्रकार 4000 बाइट्स की अधिकतम लंबाई के साथ पात्रों में से एक चर लंबाई स्ट्रिंग है। यदि init.ora पैरामीटर max_string_size डिफ़ॉल्ट है, तो कैन की अधिकतम लंबाई VARCHAR24000 बाइट्स हो सकती है। यदि init.ora पैरामीटर max_string_size = विस्तारित है, तो कैन की अधिकतम लंबाई VARCHAR232767 बाइट्स हो सकती है

VARCHARलंबाई बदलती के डेटा प्रकार भंडार चरित्र तार। पहले 2 बाइट्स में वर्ण स्ट्रिंग की लंबाई होती है, और शेष बाइट्स में स्ट्रिंग होती है। एक बाँध या परिभाषित कॉल में स्ट्रिंग की निर्दिष्ट लंबाई में दो लंबाई बाइट्स शामिल होने चाहिए, इसलिए VARCHARप्राप्त या भेजी जाने वाली सबसे बड़ी स्ट्रिंग 65533 बाइट्स लंबी हो सकती है, 65535 नहीं।

एक 12.2 डेटाबेस में एक त्वरित परीक्षण पता चलता है कि एक के रूप में आंतरिक डेटा प्रकार , ओरेकल अभी भी एक व्यवहार करता है VARCHARएक के रूप में pseudotype के लिए VARCHAR2। यह ऐसा नहीं है SYNONYMजो ओरेकल में एक वास्तविक वस्तु प्रकार है।

SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production    

SQL> create table test (my_char varchar(20));
Table created.

SQL> desc test
Name                 Null?    Type
MY_CHAR                       VARCHAR2(20)

VARCHARProC / C ++ Precompiler विकल्पों के लिए कुछ निहितार्थ भी हैं। जो प्रोग्रामर रुचि रखते हैं, उनके लिए लिंक इस प्रकार है: प्रो * C / C ++ प्रोग्रामर गाइड


1
तो इसका मतलब यह है कि VARCHARअभी भी व्यवहार करता है '' == null?

2
हाँ। ऊपर के आंतरिक बनाम बाहरी प्रकारों की चर्चा ओसीआई संदर्भ से है। 12.2 एसक्यूएल भाषा संदर्भ अभी भी किया जाता है एक ही बयान यह हमेशा VARCHAR के लिए किया गया है 'का उपयोग नहीं करते'।
विलियम रॉबर्टसन

यही कारण है कि मैंने ओसीआई मतभेदों पर चर्चा की, अन्यथा यह भविष्य के उपयोग के लिए बहुत अधिक आरक्षित है या जैसा कि वे कहते हैं कि 'चर लंबाई' जो मल्टी-बाइट UTF8 जैसे चरित्र सेटों में संकेत कर सकती है ...
सैंडमैन

1
आपने दिखाया कि VARCHAR के रूप में घोषित मूल्य VARCHAR2 के रूप में डेटाबेस में संग्रहीत हैं, हालांकि VARCHAR की अधिकतम लंबाई (65533 बाइट्स) VARCHAR2 की अधिकतम लंबाई (32767 बाइट्स) से अधिक है। डेटाबेस इसे कैसे संभालता है?
पियोट्र डोब्रोगोस्ट

IIRC, बहुत पहले (शायद Oracle 6?) एक VARCHAR प्रकार था, जिसने wrt को space padding में दुर्व्यवहार किया था - या यह रिक्त स्थान को छोटा कर रहा था? AAR, VARCHAR2 का जवाब था। Oracle कह रहा है कि वे VARCHAR वापस लाएंगे, लेकिन मुझे यकीन है, जब खाली स्ट्रिंग पूर्ण नहीं होगी, तो दांतों का कुंद हो जाएगा।
जेएमडी

2

कुछ प्रयोग (नीचे देखें) के बाद, मैं पुष्टि कर सकता हूं कि सितंबर 2017 तक, स्वीकृत उत्तर में वर्णित कार्यक्षमता के संबंध में कुछ भी नहीं बदला है : -

  1. ओरेकल 11g के लिए Rextester डेमो: खाली स्ट्रिंग के रूप में डाला जाता हैNULLदोनों के लिए रोंVARCHAR औरVARCHAR2
  2. Oracle 12c के लिए LiveSQL डेमो: वही परिणाम।

इन दोनों खोजशब्दों के ऐतिहासिक कारण को एक अलग प्रश्न के उत्तर में अच्छी तरह से समझाया गया है


0
  1. VARCHAR 2000 बाइट्स वर्णों को संग्रहीत कर सकता है, जबकि VARCHAR2 वर्णों के 4000 बाइट्स संग्रहीत कर सकता है।

  2. यदि हम डेटाटाइप को VARCHAR घोषित करते हैं तो यह NULL मानों के लिए जगह ले लेगा। VARCHAR2 डेटाटाइप के मामले में, यह NULL मानों के लिए किसी स्थान पर कब्जा नहीं करेगा। जैसे,

    name varchar(10)

नाम 'रविजी' होने पर भी 6 बाइट्स मेमोरी रखेगा

name varchar2(10) 

इनपुट स्ट्रिंग की लंबाई के अनुसार स्थान आरक्षित करेगा। उदाहरण के लिए, 'रविजी' के लिए 4 बाइट्स की मेमोरी।

यहाँ, _ NULL का प्रतिनिधित्व करता है।

नोट: varchar शून्य मानों के लिए स्थान आरक्षित करेगा और varchar2 शून्य मानों के लिए कोई स्थान आरक्षित नहीं करेगा।


2
मुझे लगता है कि यह उत्तर भ्रमित VARCHARकरने वाला है CHAR
जॉन हेलर

0

वर्तमान में, वे समान हैं। लेकिन पहले

  1. नेट पर कहीं, मैंने पढ़ा कि,

VARCHARNULLANSI मानक के रूप में, भविष्य के बीच और खाली स्ट्रिंग के बीच अंतर का समर्थन करने के लिए ओरेकल द्वारा आरक्षित है ।

VARCHAR2एक NULLऔर खाली स्ट्रिंग के बीच अंतर नहीं करता है , और कभी नहीं होगा।

  1. इसके अलावा,

Emp_name varchar(10)- यदि आप 10 अंकों से कम मूल्य दर्ज करते हैं तो शेष स्थान को हटाया नहीं जा सकता। इसमें कुल 10 जगहों का इस्तेमाल किया गया।

Emp_name varchar2(10) - यदि आप 10 अंकों से कम मूल्य दर्ज करते हैं तो शेष स्थान स्वतः हटा दिया जाता है


मैंने हाल ही में इस पोस्ट पर ठोकर खाई, कृपया ध्यान दें कि यह गलत है। निम्नलिखित को निष्पादित करें और दोनों क्षेत्र 3 वर्ण होंगे:create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;
ब्रायन लीच

-1

VARCHAR VARCHAR2 का पर्याय है। हालाँकि, आपको VARCHAR का उपयोग नहीं करना चाहिए क्योंकि Oracle भविष्य में इसके शब्दार्थ को बदल सकता है।

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