यह शायद ऐसा कुछ नहीं है जिसे आप तब तक काम कर सकते हैं जब तक आप VARCHAR2 के बजाय CLOB का उपयोग नहीं करना चाहते।
ओरेकल में, जब आप एक कॉलम घोषित करते हैं, तो डिफ़ॉल्ट बाइट-लेंथ सेमेन्टिक्स का उपयोग करना होता है। तो एक VARCHAR2 (100), उदाहरण के लिए, भंडारण के 100 बाइट आवंटित करता है। यदि आप ISO 8859-1 जैसे एकल-बाइट वर्ण सेट का उपयोग कर रहे हैं, तो प्रत्येक वर्ण को 1 बाइट संग्रहण की आवश्यकता होती है, इसलिए यह 100 वर्णों के लिए स्थान भी आवंटित करता है। लेकिन अगर आप UFT-8 जैसे मल्टी-बाइट कैरेक्टर सेट का उपयोग कर रहे हैं, तो प्रत्येक कैरेक्टर को स्टोरेज के 1 और 4 बाइट्स के बीच की आवश्यकता हो सकती है। डेटा के आधार पर, इसलिए, एक VARCHAR2(100) केवल 25 वर्णों के डेटा को संग्रहीत करने में सक्षम हो सकता है (अंग्रेज़ी वर्णों को आमतौर पर 1 बाइट की आवश्यकता होती है, यूरोपीय वर्णों को आमतौर पर 2 बाइट्स की आवश्यकता होती है, और एशियाई वर्णों को आमतौर पर 3 बाइट्स की आवश्यकता होती है)।
आप ओरेकल को कैरेक्टर लेंथ सेमेन्टिक्स का उपयोग करने के लिए कह सकते हैं जो सामान्य रूप से आईएसओ-8859-1 डेटाबेस से यूटीएफ -8 डेटाबेस में जाने पर मैं सुझाव देता हूं। यदि आप एक कॉलम VARCHAR2 (100 CHAR) घोषित करते हैं, तो Oracle 100 वर्णों के लिए स्थान आवंटित करेगा चाहे वह 100 बाइट्स या 400 बाइट्स हो। आप डिफ़ॉल्ट (नए डीडीएल के लिए) को बदलने के लिए NLS_LENGTH_SEMANTICS पैरामीटर को CHAR पर भी सेट कर सकते हैं ताकि एक VARCHAR2(100) 100 बाइट्स के बजाय 100 वर्णों का भंडारण आवंटित करे।
दुर्भाग्य से आपके लिए, हालांकि, Oracle VARCHAR2 (PL/SQL इंजन के बजाय SQL इंजन के संदर्भ में) के आकार की सीमा 4000 बाइट्स है। तो भले ही आप एक कॉलम VARCHAR2 (4000 CHAR) घोषित करते हैं, फिर भी आप वास्तव में 4000 बाइट्स डेटा डालने तक सीमित रहेंगे जो कि 1000 वर्णों से कम हो सकता है। उदाहरण के लिए, AL32UTF8 कैरेक्टर सेट का उपयोग करने वाले डेटाबेस में, मैं एक कॉलम VARCHAR2(4000 CHAR) घोषित कर सकता हूं लेकिन एक कैरेक्टर डालने के लिए जिसमें 2 बाइट्स स्टोरेज की आवश्यकता होती है, यह दर्शाता है कि मैं वास्तव में डेटा के 4000 कैरेक्टर नहीं डाल सकता
SQL> create table foo (
2 col1 varchar2(4000 char)
3 );
Table created.
SQL> insert into foo values( rpad( 'abcde', 4000, unistr('\00f6') ) );
1 row created.
SQL> ed
Wrote file afiedt.buf
1* insert into foo values( rpad( 'abcde', 6000, unistr('\00f6') ) )
SQL> /
1 row created.
SQL> select length(col1), lengthb(col1)
2 from foo;
LENGTH(COL1) LENGTHB(COL1)
------------ -------------
2003 4000
2003 4000
यदि आपको UTF-8 डेटा के 4000 वर्णों को संग्रहीत करने की आवश्यकता है, तो आपको एक डेटा प्रकार की आवश्यकता होगी जो 16000 बाइट्स को संभाल सके, जिसके लिए CLOB में जाने की आवश्यकता होगी।