स्तंभ डेटाटिप्स में BYTE और CHAR के बीच अंतर


166

ओरेकल में, क्या अंतर है:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

तथा

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

जवाबों:


265

आइए मान लें कि डेटाबेस कैरेक्टर सेट UTF-8 है, जो कि Oracle के हाल के संस्करणों में अनुशंसित सेटिंग है। इस स्थिति में, कुछ वर्ण डेटाबेस में संग्रहीत करने के लिए 1 से अधिक बाइट लेते हैं।

यदि आप फ़ील्ड को इस रूप में परिभाषित करते हैं VARCHAR2(11 BYTE) , तो Oracle स्टोरेज के लिए 11 बाइट्स का उपयोग कर सकता है, लेकिन आप वास्तव में फ़ील्ड में 11 वर्णों को संग्रहीत करने में सक्षम नहीं हो सकते हैं, क्योंकि उनमें से कुछ स्टोर करने के लिए एक से अधिक बाइट लेते हैं, जैसे गैर-अंग्रेज़ी वर्ण।

फ़ील्ड को परिभाषित करने के रूप में VARCHAR2(11 CHAR)आप ओरेकल को बताते हैं कि यह 11 वर्णों को संग्रहीत करने के लिए पर्याप्त स्थान का उपयोग कर सकता है, चाहे वह प्रत्येक को संग्रहीत करने के लिए कितने बाइट्स लेता हो। एक एकल वर्ण को 4 बाइट तक की आवश्यकता हो सकती है।


55
ध्यान दें कि वर्ण लंबाई शब्दार्थ 4000 बाइट की अधिकतम लंबाई को प्रभावित नहीं करता है a VARCHAR2VARCHAR2(4000 CHAR)यदि वर्णों में से कुछ को एकाधिक बाइट्स की आवश्यकता होती है, तो 4000 से कम वर्णों की घोषणा करने की अनुमति होगी।
जस्टिन गुफा

@ डेविड सैक्स क्या यह शब्दार्थ NVARCHAR (11) के साथ समान है?
नेप

@ अब तक मुझे पता नहीं है। मेरा मानना ​​है कि NVARCHAR प्रकार की घोषणा में आकार पैरामीटर का अर्थ VARCHAR2 जैसा है। यानी NVARCHAR वर्ण में 11 वर्णों (बाइट्स) के लिए पर्याप्त संग्रहण स्थान सुनिश्चित करने के लिए आप कहेंगे NVARCHAR (11 CHAR)। नोट: मैंने वास्तव में इसकी जाँच नहीं की है। मैंने कभी NVARCHAR का उपयोग नहीं किया।
डेविड साइक्स

आगे दोनों के बीच के अंतर को स्पष्ट करने के लिए: एक हेक्स-एन्कोडेड मान के चार वर्ण (अर्थात "0xFF") या तीन दशमलव वर्ण (अर्थात "255") एक एकल बाइट के रूप में प्रस्तुत किए जाने पर "संपीड़ित" हो सकते हैं: 11111111। यह तब हो सकता है बिट झंडे (8 सेटिंग्स तक), बिटवाइज़ ऑपरेशंस आदि के लिए उपयोगी हो
मैट बोरजा

ध्यान दें कि 1 ASCII चरित्र के रूप में (dec। 49) 1001001 है जबकि 1 बिट के रूप में 00000001 है।
मैट बोरजा

21

एक में 11 बाइट्स के लिए बिल्कुल जगह है, दूसरे में ठीक 11 अक्षरों के लिए। यूनिकोड वेरिएंट जैसे कुछ चार्ट्स प्रति चार्ट एक से अधिक बाइट का उपयोग कर सकते हैं, इसलिए 11 बाइट फ़ील्ड में एन्कोडिंग के आधार पर 11 से कम चार्ट के लिए स्थान हो सकता है।

Http://www.joelonsoftware.com/articles/Unicode.html भी देखें


17

सिस्टम कॉन्फ़िगरेशन के आधार पर, BYTES में निर्मित CHAR का आकार अलग-अलग हो सकता है। आपके उदाहरणों में:

  1. फ़ील्ड को 11 BYTE तक सीमित करता है
  2. 11 CHAR अभिनेताओं के लिए क्षेत्र सीमित करता है


निष्कर्ष: 1 CHAR 1 BYTE के बराबर नहीं है।


4

मुझे यकीन नहीं है क्योंकि मैं ओरेकल उपयोगकर्ता नहीं हूं, लेकिन मुझे लगता है कि जब आप यूनिकोड (यूटीएफ -16 / 32) जैसे मल्टी-बाइट कैरेक्टर सेट का उपयोग करते हैं तो यह अंतर निहित है। इस स्थिति में, 11 बाइट्स में 11 से कम अक्षर हो सकते हैं।

साथ ही उन फ़ील्ड प्रकारों का उच्चारण पात्रों या मामले के संबंध में अलग तरह से किया जा सकता है, उदाहरण के लिए 'बाइनरीफिल्ड (ete) = "été" का मिलान नहीं होगा जबकि' charField (ete) = "été" '(फिर से Oracle के बारे में निश्चित नहीं है)' ।

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