sql server - वर्कर और नवराकर के बीच क्या अंतर है?




sql-server varchar (12)

क्या यह सिर्फ nvarchar multibyte अक्षर का समर्थन करता है? यदि ऐसा है, तो varchars का उपयोग करने के लिए स्टोरेज चिंताओं के अलावा, वास्तव में कोई बिंदु है?


nVarchar आपको यूनिकोड वर्णों को स्टोर करने में मदद करेगा। यदि आप स्थानीयकृत डेटा स्टोर करना चाहते हैं तो यह तरीका है।


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


एक nvarchar कॉलम किसी भी यूनिकोड डेटा स्टोर कर सकते हैं। एक varchar कॉलम 8-बिट कोडपेज तक ही सीमित है। कुछ लोग सोचते हैं कि varchar का उपयोग किया जाना चाहिए क्योंकि यह कम जगह लेता है। मुझे विश्वास है कि यह सही जवाब नहीं है। कोडपेज असंगतताएं एक दर्द हैं, और यूनिकोड कोडपेज समस्याओं के लिए इलाज है। आजकल सस्ते डिस्क और मेमोरी के साथ, कोड पृष्ठों के साथ अब समय के साथ मिलकर बर्बाद करने का कोई कारण नहीं है।

सभी आधुनिक ऑपरेटिंग सिस्टम और विकास प्लेटफॉर्म आंतरिक रूप से यूनिकोड का उपयोग करते हैं। nvarchar बजाए nvarchar का उपयोग करके, जब भी आप डेटाबेस से पढ़ते हैं या लिखते हैं तो आप एन्कोडिंग रूपांतरण करने से बच सकते हैं। रूपांतरण समय लेते हैं, और त्रुटियों से ग्रस्त हैं। और रूपांतरण त्रुटियों से वसूली एक गैर-मामूली समस्या है।

यदि आप केवल एक ASCII का उपयोग करने वाले एप्लिकेशन के साथ इंटरफेसिंग कर रहे हैं, तो भी मैं डेटाबेस में यूनिकोड का उपयोग करने की सलाह दूंगा। ओएस और डेटाबेस संयोजन एल्गोरिदम यूनिकोड के साथ बेहतर काम करेंगे। अन्य सिस्टम के साथ इंटरफेसिंग करते समय यूनिकोड रूपांतरण समस्याओं से बचाता है। और आप भविष्य के लिए तैयारी करेंगे। और आप हमेशा यह सत्यापित कर सकते हैं कि पूर्ण यूनिकोड स्टोरेज के कुछ लाभों का आनंद लेने के दौरान भी, आपके डेटा को बनाए रखने के लिए जो भी विरासत प्रणाली बनाए रखने के लिए आपका डेटा 7-बिट ASCII तक सीमित है।


मुख्य रूप से nvarchar यूनिकोड वर्णों और varchar स्टोर गैर-यूनिकोड वर्णों को स्टोर करता है।

"यूनिकोड्स" का अर्थ है 16-बिट कैरेक्टर एन्कोडिंग स्कीम अरबी, हिब्रू, चीनी, जापानी जैसी कई अन्य भाषाओं के पात्रों को एकल वर्ण सेट में एन्कोड करने की इजाजत देता है।

इसका मतलब है कि यूनिकोड स्टोर के लिए प्रति बाइट 2 बाइट्स का उपयोग कर रहा है और नॉन्यूनिकोड स्टोर करने के लिए केवल एक बाइट प्रति वर्ण का उपयोग करता है। जिसका मतलब है कि यूनिकोड को गैर-यूनिकोड की तुलना में स्टोर करने के लिए डबल क्षमता की आवश्यकता होती है।


मेरे दो सेंट

  1. सही डेटाटाइप का उपयोग न करने पर इंडेक्स विफल हो सकते हैं:
    SQL सर्वर में: जब आपके पास VARCHAR कॉलम पर एक अनुक्रमणिका होती है और इसे एक यूनिकोड स्ट्रिंग प्रस्तुत करती है, तो SQL सर्वर अनुक्रमणिका का उपयोग नहीं करता है। वही बात तब होती है जब आप एक BigInt को अनुक्रमित-कॉलम में SmallInt युक्त प्रस्तुत करते हैं। यहां तक ​​कि यदि BigInt छोटा छोटा होने के लिए पर्याप्त छोटा है, तो SQL सर्वर अनुक्रमणिका का उपयोग करने में सक्षम नहीं है। आपके आस-पास के अन्य तरीकों में यह समस्या नहीं है (जब एक अनुक्रमित BigInt otARCHAR कॉलम में SmallInt या Ansi-Code प्रदान करते हैं)।

  2. विभिन्न डीबीएमएस (डाटाबेस प्रबंधन प्रणाली) के बीच डेटाटाइप भिन्न हो सकते हैं:
    जानें कि प्रत्येक डेटाबेस में थोड़ा अलग डेटाटाइप हैं और वचरर का मतलब हर जगह समान नहीं है। जबकि SQL सर्वर में VARCHAR और NVARCHAR है, अपाचे / डर्बी डेटाबेस में केवल वचरर है और विक्चर यूनिकोड में है।


मैं कहूंगा, यह निर्भर करता है।

यदि आप डेस्कटॉप एप्लिकेशन विकसित करते हैं, जहां ओएस यूनिकोड (सभी मौजूदा विंडोज सिस्टम की तरह) में काम करता है और भाषा मूल रूप से यूनिकोड का समर्थन करती है (डिफ़ॉल्ट तार यूनिकोड हैं, जैसे जावा या सी #), तो nvarchar पर जाएं।

यदि आप एक वेब अनुप्रयोग विकसित करते हैं, जहां तार यूटीएफ -8 के रूप में आते हैं, और भाषा PHP है, जो अभी भी यूनिकोड को मूल रूप से (संस्करण 5.x में) का समर्थन नहीं करती है, तो वर्चर शायद बेहतर विकल्प होगा।


मैंने जवाबों पर एक नज़र डाली और कई लोग nvarchar पर nvarchar का उपयोग करने की सलाह देते हैं, क्योंकि अंतरिक्ष अब कोई समस्या नहीं है, इसलिए यूनिकोड को थोड़ा अतिरिक्त भंडारण के लिए सक्षम करने में कोई हानि नहीं है। खैर, यह हमेशा सत्य नहीं होता है जब आप अपने कॉलम पर एक इंडेक्स लागू करना चाहते हैं। SQL सर्वर की उस फ़ील्ड के आकार पर 900 बाइट्स की सीमा है जो आप इंडेक्स कर सकते हैं। तो यदि आपके पास varchar(900) तो आप अभी भी इसे अनुक्रमित कर सकते हैं, लेकिन varchar(901)nvarchar साथ, पात्रों की संख्या आधा है, तो आप nvarchar(450) तक सूचकांक कर सकते हैं। तो अगर आपको विश्वास है कि आपको nvarchar आवश्यकता नहीं है, तो मैं इसका उपयोग करने की अनुशंसा नहीं करता हूं।

आम तौर पर, डेटाबेस में, मैं आपको आवश्यक आकार के चिपके रहने की सलाह देता हूं, क्योंकि आप हमेशा विस्तार कर सकते हैं। उदाहरण के लिए, काम पर एक सहयोगी ने एक बार सोचा था कि कॉलम के लिए nvarchar(max) का उपयोग करने में कोई हानि नहीं है, क्योंकि हमें स्टोरेज के साथ कोई समस्या नहीं है। बाद में, जब हमने इस कॉलम पर एक इंडेक्स लागू करने का प्रयास किया, तो SQL सर्वर ने इसे खारिज कर दिया। यदि, हालांकि, उन्होंने varchar(5) साथ भी शुरुआत की, तो हम इसे बाद में विस्तारित कर सकते थे जिसे हमें ऐसी किसी समस्या के बिना जरूरी है जिसके लिए हमें इस समस्या को ठीक करने के लिए फील्ड माइग्रेशन प्लान करने की आवश्यकता होगी।


यदि एक चरित्र को स्टोर करने के लिए एक बाइट का उपयोग किया जाता है, तो 256 संभावित संयोजन होते हैं, और इस प्रकार आप 256 विभिन्न पात्रों को बचा सकते हैं। संयोजन एक ऐसा पैटर्न है जो वर्णों और नियमों को परिभाषित करता है जिनके द्वारा उनकी तुलना और क्रमबद्ध किया जाता है।

1252, जो लैटिन 1 (एएनएसआई) है, सबसे आम है। एकल-बाइट चरित्र सेट भी कई भाषाओं द्वारा उपयोग किए जाने वाले सभी पात्रों को स्टोर करने के लिए अपर्याप्त हैं। उदाहरण के लिए, कुछ एशियाई भाषाओं में हजारों वर्ण हैं, इसलिए उन्हें प्रति चरित्र दो बाइट्स का उपयोग करना चाहिए।

यूनिकोड मानक

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

एसक्यूएल सर्वर में चरित्र डेटाटाइप की दो श्रेणियां हैं:

  • गैर-यूनिकोड (चार, वर्कर, और टेक्स्ट)
  • यूनिकोड (nchar, nvarchar, और ntext)

अगर हमें कई देशों से चरित्र डेटा को सहेजने की ज़रूरत है, तो हमेशा यूनिकोड का उपयोग करें।


यह इस बात पर निर्भर करता है कि ओरेकल कैसे स्थापित किया गया था। स्थापना प्रक्रिया के दौरान, NLS_CHARACTERSET विकल्प सेट है। आप इसे SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' क्वेरी के साथ ढूंढ सकते हैं SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'

यदि आपका NLS_CHARACTERSET यूटीएफ 8 जैसे यूनिकोड एन्कोडिंग है, तो बढ़िया। VARCHAR और NVARCHAR का उपयोग करना काफी समान है। अभी पढ़ना बंद करो, बस इसके लिए जाओ। अन्यथा, या यदि आपके पास ओरेकल चरित्र सेट पर कोई नियंत्रण नहीं है, तो पढ़ें।

VARCHAR - डेटा NLS_CHARACTERSET एन्कोडिंग में संग्रहीत किया जाता है। यदि एक ही सर्वर पर अन्य डेटाबेस उदाहरण हैं, तो आप उनके द्वारा प्रतिबंधित हो सकते हैं; और इसके विपरीत, क्योंकि आपको सेटिंग साझा करना है। ऐसा क्षेत्र किसी भी डेटा को स्टोर कर सकता है जिसे उस चरित्र सेट का उपयोग करके एन्कोड किया जा सकता है, और कुछ भी नहीं । तो उदाहरण के लिए यदि चरित्र सेट एमएस -1252 है, तो आप केवल अंग्रेज़ी अक्षरों जैसे अक्षरों को संग्रहित कर सकते हैं, कुछ हद तक उच्चारण किए गए अक्षरों और कुछ अन्य (जैसे € और -)। आपका आवेदन केवल कुछ स्थानीय लोगों के लिए उपयोगी होगा, जो दुनिया में कहीं और संचालित करने में असमर्थ हैं। इस कारण से, इसे एक बुरा विचार माना जाता है।

NVARCHAR - डेटा यूनिकोड एन्कोडिंग में संग्रहीत किया जाता है। हर भाषा समर्थित है। एक अच्छा विचार।

स्टोरेज स्पेस के बारे में क्या? VARCHAR आमतौर पर कुशल है, क्योंकि चरित्र सेट / एन्कोडिंग एक विशिष्ट लोकेल के लिए कस्टम-डिज़ाइन किया गया था। एनवीएआरएआरएआर फ़ील्ड या तो यूटीएफ -8 या यूटीएफ -16 एन्कोडिंग में स्टोर करते हैं, एनएलएस सेटिंग पर आधार काफी हद तक पर्याप्त है। यूटीएफ -8 "पश्चिमी" भाषाओं के लिए बहुत ही कुशल है, जबकि एशियाई भाषाओं का समर्थन करता है। यूटीएफ -16 एशियाई भाषाओं के लिए बहुत ही कुशल है, जबकि अभी भी "पश्चिमी" भाषाओं का समर्थन करता है। यदि स्टोरेज स्पेस के बारे में चिंतित है, तो ओरेकल को उपयुक्त के रूप में यूटीएफ -8 या यूटीएफ -16 का उपयोग करने के लिए एनएलएस सेटिंग चुनें।

प्रसंस्करण गति के बारे में क्या? अधिकांश नए कोडिंग प्लेटफॉर्म यूनिकोड को मूल रूप से उपयोग करते हैं (जावा, .NET, यहां तक ​​कि सी ++ std :: wstring साल पहले!) ताकि डेटाबेस फ़ील्ड VARCHAR है, यह ओरेकल को प्रत्येक पढ़ने या लिखने पर चरित्र सेट के बीच कनवर्ट करने के लिए मजबूर करता है, इतना अच्छा नहीं। NVARCHAR का उपयोग रूपांतरण से बचाता है।

निचली पंक्ति: NVARCHAR का प्रयोग करें! यह सीमाओं और निर्भरताओं से बचाता है, भंडारण स्थान के लिए ठीक है, और आमतौर पर प्रदर्शन के लिए भी सबसे अच्छा है।


यहां आप varchar और nvarchar बीच मतभेद देख सकते हैं।

संदर्भ: SqlHints.com

Nvarchar और varchar के बारे में अधिक जानकारी के लिए, इस ब्लॉग पोस्ट देखें।


Varchar(n) और nvarchar(n) बीच मुख्य अंतर है:

Varchar (परिवर्तनीय-लंबाई, गैर-यूनिकोड वर्ण डेटा) आकार 8000 तक है। 1. यह एक चर लंबाई लंबाई डेटा प्रकार है

  1. गैर-यूनिकोड वर्णों को स्टोर करने के लिए प्रयुक्त होता है

  2. प्रत्येक चरित्र के लिए अंतरिक्ष के 1 बाइट पर कब्जा करता है

Nvarchar : परिवर्तनीय लंबाई यूनिकोड चरित्र डेटा।

1. यह एक चर-लंबाई डेटा प्रकार है

2. यूनिकोड वर्णों को स्टोर करने के लिए उपयोग किया जाता है।

  1. डेटा यूनिकोड एन्कोडिंग में संग्रहीत किया जाता है। हर भाषा समर्थित है। (उदाहरण के लिए अरबी, जर्मन, हिंदी, आदि भाषाएं)

nvarchar हमारे कोड त्रुटि मुक्त करने के लिए varchar की तुलना में उपयोग करने के लिए सुरक्षित है ( nvarchar टाइप करें) क्योंकि nvarchar यूनिकोड वर्णों को भी अनुमति देता है। जब हम SQL सर्वर क्वेरी में स्थित स्थिति का उपयोग करते हैं और यदि हम = ऑपरेटर का उपयोग कर रहे हैं, तो यह कुछ बार त्रुटि फेंक देगा। इसके लिए संभावित कारण है हमारे मानचित्रण कॉलम वर्चर्स में अलग हो जाएगा। अगर हमने इसे nvarchar में परिभाषित किया है तो यह समस्या नहीं होती है। फिर भी हम varchar चिपके रहते हैं और इस मुद्दे से बचते हैं, हम बेहतर जगह के बजाय LIKE कुंजी शब्द का उपयोग करते हैं।





nvarchar