लेकिन varchar की परिभाषा कहती है, यह गैर-यूनिकोड स्ट्रिंग डेटा की अनुमति देता है । लेकिन ट्रेडमार्क (™) और पंजीकृत (®) प्रतीक यूनिकोड वर्ण हैं । क्या परिभाषा varchar datatype की संपत्ति का विरोध करती है?
हालांकि अन्य उत्तर गलत नहीं हैं, मुझे लगता है कि यह आधार शब्दावली में एक भ्रम को इंगित करने में मदद करेगा। मैंने इस उलझन के उदाहरण के रूप में प्रश्न के उपरोक्त उद्धरण में दो शब्दों पर जोर दिया है। जब SQL सर्वर प्रलेखन यूनिकोड और गैर-यूनिकोड डेटा की बात करता है , तो वे वर्णों के बारे में बात नहीं कर रहे हैं । वे बाइट दृश्यों की बात कर रहे हैं जो कुछ वर्णों का प्रतिनिधित्व करते हैं। यूनिकोड प्रकार (के बीच प्राथमिक अंतर , , , और पदावनत / बुराई ) और गैर-यूनिकोड प्रकार ( , , और पदावनत / बुराई ) क्या है प्रकार बाइट दृश्यों के वे स्टोर कर सकते हैं।NCHARNVARCHARXMLNTEXTCHARVARCHARTEXT
गैर-यूनिकोड प्रकार कई 8-बिट एन्कोडिंग में से एक को संग्रहीत करते हैं, जबकि यूनिकोड प्रकार एकल 16-बिट यूनिकोड एन्कोडिंग को स्टोर करते हैं: UTF-16 लिटिल एंडियन। जैसा कि अन्य उत्तरों ने उल्लेख किया है, कौन से वर्ण 8-बिट / गैर-यूनिकोड एन्कोडिंग में संग्रहीत किए जा सकते हैं, कोड पृष्ठ पर निर्भर करता है, जो कि Collation द्वारा निर्धारित किया जाता है। हालांकि अन्य लोगों ने नोट किया है कि "वर्ण" का बाइट मान कोड पृष्ठों पर भिन्न हो सकता है, जिस पर यह पाया जाता है, बाइट मान समान कोड पेज के भीतर भी भिन्न ईबीडीआईसी कोड पेजों में से एक के साथ भिन्न हो सकता है। 1252), जो केवल पुराने में पाया जाता है, को वास्तव में इस्तेमाल किया जाने वाला SQL सर्वर Collations नहीं होना चाहिए (अर्थात जिनके नाम शुरू होते हैं SQL_)।
इसलिए, परिभाषा सटीक है: गैर-यूनिकोड प्रकार में संग्रहीत करने के लिए आप जो भी वर्ण प्रबंधित कर सकते हैं, वे हमेशा 8-बिट होते हैं (भले ही वे संयोजन में दो 8-बिट मानों का उपयोग एक एकल "वर्ण" के रूप में करते हैं, जो कि डबल है- बाइट कैरेक्टर सेट / DBCS कोड पेज के लिए अनुमति देते हैं)। और यूनिकोड डेटाटिप्स हमेशा 16-बिट होते हैं, भले ही वे कभी-कभी दो 16-बिट मानों को एक एकल "वर्ण" (यानी एक सरोगेट जोड़ी जो बदले में एक पूरक चरित्र का प्रतिनिधित्व करते हैं) के रूप में उपयोग करते हैं।
और, SQL सर्वर 2019 के लिए UTF-8 एन्कोडिंग VARCHARऔर CHARडेटाटाइप्स का मूल रूप से समर्थन करने के कारण ,
VARCHARअब "गैर-यूनिकोड" के रूप में संदर्भित नहीं किया जा सकता है। इसलिए, सितंबर 2018 में SQL सर्वर 2019 के पहले सार्वजनिक बीटा के साथ शुरू करना चाहिए, हमें VARCHARSQL सर्वर 2019 से पहले संस्करणों के संदर्भ में बोलते हुए भी "8-बिट डेटाटाइप" के रूप में संदर्भित करना चाहिए। यह शब्दावली सभी 4 प्रकारों के लिए सही है जिन एनकोडिंग का उपयोग किया जा सकता है VARCHAR:
- विस्तारित ASCII
- डबल-बाइट कैरेक्टर सेट (DBCS)
- EBCDIC
- UTF-8 (यूनिकोड)
केवल TEXTडेटाटाइप (SQL सर्वर 2005 के रूप में पदावनत, इसलिए इसका उपयोग न करें) "गैर-यूनिकोड" है, लेकिन यह सिर्फ एक तकनीकीता है, और इसे "8-बिट डेटाटाइप" के रूप में संदर्भित करना सटीक है।
NVARCHAR, NCHARऔर NTEXT"UTF-16" या "16-बिट डेटाटाइप" के रूप में संदर्भित किया जा सकता है। ओरेकल, मेरा मानना है, के लिए "यूनिकोड-ओनली" की शब्दावली का उपयोग करता है NVARCHAR, लेकिन यह स्पष्ट रूप से यूटीएफ -8 (एक यूनिकोड एन्कोडिंग) का उपयोग करने की संभावना से इनकार नहीं करता है, जो काम नहीं करेगा, इसलिए संभवतः इसके साथ छड़ी करना सबसे अच्छा है पहले दो विकल्प।
नए UTF-8 एनकोडिंग के विवरण के लिए, कृपया मेरी पोस्ट देखें:
SQL Server 2019 में मूल निवासी UTF-8 समर्थन: उद्धारकर्ता या गलत पैगंबर?
पुनश्च मैं धीरे-धीरे इन परिवर्तनों को प्रतिबिंबित करने के लिए SQL सर्वर प्रलेखन को अद्यतन करने के माध्यम से अपना काम कर रहा हूं।
PPS Microsoft ने पहले ही UTF-8 जानकारी के साथ कुछ पेज अपडेट किए हैं, जिसमें प्रश्न में संदर्भित चार और varchar प्रलेखन शामिल हैं। इसमें अब "गैर-यूनिकोड" वाक्यांश शामिल नहीं है। लेकिन यह सिर्फ एक FYI है; यह इस सवाल को नहीं बदलता है क्योंकि यह गैर-यूनिकोड एन्कोडिंग वाले पात्रों के बारे में है जिन्हें गलती से यूनिकोड-केवल माना गया था।