Varchar और nvarchar SQL Server डेटा प्रकारों के बीच मुख्य प्रदर्शन अंतर क्या हैं?


236

मैं अपने स्कूल में एक छोटे वेब ऐप के लिए डेटाबेस का उपयोग कर काम कर रहा हूं SQL Server 2005
मैं के मुद्दे पर विचार के स्कूलों के एक जोड़े को देखने varcharबनाम nvarchar:

  1. varcharतब तक उपयोग करें जब तक आप बहुत सारे अंतर्राष्ट्रीय डेटा के साथ सौदा नहीं करते हैं, तब उपयोग करें nvarchar
  2. बस nvarcharसब कुछ के लिए उपयोग करें ।

मैं देखने के गुण को देखने लगा हूं। मुझे पता है कि नावरचर्च दो बार ज्यादा जगह लेता है, लेकिन यह जरूरी नहीं है क्योंकि यह केवल कुछ सौ छात्रों के लिए डेटा स्टोर करने वाला है। मेरे लिए ऐसा लगता है कि इसके बारे में चिंता करना आसान नहीं होगा और बस सब कुछ नवरच का उपयोग करने की अनुमति देगा। या क्या मुझे कुछ याद आ रहा है?


इसी तरह का प्रश्न यहां: stackoverflow.com/questions/312170/… EDIT by le dorfier: जो दिलचस्प रूप से बिल्कुल विपरीत निष्कर्ष पर आया था।
बूजी बॉय

6
संदर्भ अधिक व्यापक धागा जो विपरीत निष्कर्ष पर आया। stackoverflow.com/questions/312170/…
dkretz

2
जेसन: मुझे आशा है कि यह एक अनुचित अनुरोध नहीं है, लेकिन क्या आप कृपया gbn के स्वीकृत उत्तर को बदलने पर विचार कर सकते हैं । जोबार्न का जवाब कई कारणों से बेहद गलत है। यह होने के बाद "स्वीकार किए जाते हैं" गलत विकल्प बनाने में नौसिखियों को गुमराह करता है। यह "हमेशा उपयोग NVARCHAR" करने के लिए अनावश्यक और बेकार है , और यह प्रदर्शन और हार्डवेयर लागत / बजट पर बहुत नकारात्मक प्रभाव डाल सकता है। कुछ पंक्तियों, यहां तक ​​कि कुछ हजार, कोई फर्क नहीं पड़ेगा। लेकिन सिस्टम लोगों की अपेक्षा अधिक तेजी से बढ़ता है, इसलिए वर्तमान स्वीकृत जवाब समुदाय के लिए एक असंतोष है। धन्यवाद।
सुलैमान रटज़की

जवाबों:


140

हमेशा निवारक का उपयोग करें।

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

Varchar से nvarchar में एक एप्लिकेशन को माइग्रेट करने की लागत आपके द्वारा अधिकांश एप्लिकेशन में उपयोग की जाने वाली अतिरिक्त डिस्क स्थान की थोड़ी अधिक से अधिक होगी।


4
बहुभाषी पाठ / संदेश, टाइम ज़ोन, माप और मुद्रा की इकाइयों के लिए समर्थन जोड़ना बहुत कठिन है, इसलिए हर कोई अपने आवेदन में हमेशा एक दिन, ALWAYS (भले ही यह आपके होम पेज वेब पर ही क्यों न हो) को अवश्य दर्ज करता है। एप्लिकेशन)!
के.एम.

82
सूचकांक आकार, स्मृति उपयोग आदि के बारे में क्या? मुझे लगता है कि आप हमेशा int का उपयोग करते हैं जब आप भी "बस के मामले में" हो सकता है?
gbn

99
हमेशा एक बहुभाषी साइट के लिए कोडिंग / योजना (जब आपके पास कोई स्याही नहीं है कि आपको कभी भी इसकी आवश्यकता होगी) सभी युवा वयस्कों को यह बताने की तरह है कि उन्हें अपनी पहली कार के लिए एक बड़ी 8 सीट, गैस-ग्लोबिंग एसयूवी खरीदना चाहिए ... आखिर , वे किसी दिन शादी कर सकते हैं और 6 बच्चे हो सकते हैं,। जब तक मैं कर सकता / सकती हूं, जब मुझे इसकी आवश्यकता होती है, तो मैं इसके प्रदर्शन और कार्यकुशलता का आनंद ले सकता / सकती हूं।
ईजे ब्रेनन

4
@cbmeeks: मैं नहीं है कि मैं क्या करने के लिए कोड नहीं है पता है। लेकिन अगर आप इसे ध्यान देने योग्य प्रदर्शन हिट के साथ उपयोग कर सकते हैं, तो आपके डेटाबेस इसके लिए बहुत बड़े नहीं हैं ...
gbn

60
आमतौर पर जब लोग "हमेशा" शब्द के साथ अपना जवाब शुरू करते हैं तो आपको उसके बाद आने वाली हर चीज को नजरअंदाज करना चाहिए। (नोटिस मैंने उस वक्तव्य को "आमतौर पर" :)
ब्रैंडन मूर

226

डिस्क स्थान मुद्दा नहीं है ... लेकिन स्मृति और प्रदर्शन होगा। डबल पेज पढ़ता है, डबल इंडेक्स साइज़, अजीब LIKE और = निरंतर व्यवहार आदि

क्या आपको चीनी आदि स्क्रिप्ट को स्टोर करने की आवश्यकता है? हाँ या ना...

और MS BOL " यूनिकोड के संग्रहण और प्रदर्शन प्रभाव " से

संपादित करें :

हाल ही में एसओ सवाल पर प्रकाश डालते हैं कि नवरच का प्रदर्शन कितना खराब हो सकता है ...

SQL सर्वर nvarchar स्ट्रिंग्स के अंदर खोज करते समय उच्च CPU का उपयोग करता है


19
+1, यदि आपका ऐप अंतर्राष्ट्रीय हो जाता है, तो आपको इस बारे में चिंता करने के लिए कई अन्य मुद्दे होंगे कि एक खोज / nvarchar की जगह: बहुभाषी पाठ / संदेश, समय क्षेत्र, माप और मुद्रा की इकाइयां
KM।

2
लेकिन क्या होगा यदि आपको कभी-कभी एक विदेशी नाम स्टोर करने की आवश्यकता होती है, जैसे जोस या ब्योर्न?
क्वर्टी

7
@ क्वर्टी: तब आप नवरचेर का उपयोग करते हैं। आप इसका उपयोग नहीं करते हैं यह अनावश्यक रूप से उपयोग करते हैं। वे 2 नाम वैसे भी IIRC में फिट हैं
gbn

6
डिस्क स्थान कहना हर किसी के लिए सही नहीं है। हमने कई वर्षों में संग्रहित अरबों अभिलेखों के साथ बड़े बैंकिंग अनुप्रयोग में अनावश्यक रूप से नवरचार का उपयोग किया है। प्रतिकृति, बैकअप और आपदा वसूली के साथ महंगे सैन आधारित भंडारण के साथ, यह वास्तव में नवरच बनाम वर्चर की लागत में लाखों डॉलर का अनुवाद कर सकता है। उल्लेख करने के लिए नहीं है कि हर पढ़ने के लिए डिस्क से दो बार के रूप में कई बाइट्स पढ़ने के लिए एक बड़ा (100%) प्रदर्शन प्रभाव है।
codemonkey

2
@codemonkey, et al: मैंने निम्नलिखित लेख में समग्र रूप से व्यर्थ हुए स्थान के मुद्दे को हल करने के लिए क्या किया: डिस्क सस्ता हो सकता है! औरली? (मुफ्त पंजीकरण की आवश्यकता है, हालांकि)। यह लेख उस स्थिति को रोकने में मदद करने के लिए है, जो कोडनेम महंगा, उद्यम स्तर के भंडारण के बारे में है।
सोलोमन रटज़की

59

निरतंरता बनाए रखें! NVARCHAR में एक वार्च को शामिल करने से बड़ा प्रदर्शन प्रभावित होता है।


115
यदि आप चरित्र क्षेत्रों में शामिल हो रहे हैं, तो आपके डेटाबेस में शायद इससे भी बदतर मुद्दे हैं कि क्या नवरच या वरचर का उपयोग करना है, आमतौर पर बोलना।
ब्रैंडन मूर

@Thomas Harlan एक साधारण परीक्षण मेरे लिए यह दर्शाता है में शामिल होने के बीच कोई ठोस अंतर है कि वहाँ nvarcharके लिए varcharपरिवर्तित बनाम nvarcharकरने के लिए varcharऔर करने के लिए शामिल होने के varchar। जब तक कि आप का अर्थ कॉलम डेटाेटिप में सुसंगत नहीं था, शामिल होने में नहीं।
अजेह

1
@ याह और थॉमस: 1) "सरल" परीक्षण अक्सर भ्रामक होते हैं क्योंकि वे व्यवहार में अंतर पैदा करने वाले बदलावों को कवर नहीं करते हैं। 2) यदि कोई मिश्रण करते समय एक कठोर प्रदर्शन देखता है , VARCHARऔर NVARCHARयह उस VARCHARस्तंभ के प्रकार (और इसलिए सूचकांक) के लिए उपयोग किए जाने वाले कॉलम के अनुक्रमण के साथ होना चाहिए । मैं इस विषय को निम्नलिखित ब्लॉग पोस्ट में विस्तार से कवर करता हूं: अनुक्रमणिका पर प्रभाव जब मिक्सिंग वर्चस् और एनवीएआरएचएआरएच प्रकार
सोलोमन रटज़की

44

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

मेरे पास एक कठिन और तेज़ "हमेशा नवरचटर" नियम नहीं होगा क्योंकि यह कई स्थितियों में पूरी तरह से बेकार हो सकता है - विशेष रूप से एएससीआईआई / ईबीसीडीआईसी या पहचानकर्ता और कोड कॉलम से ईटीएल जो अक्सर कुंजी और विदेशी कुंजी होते हैं।

दूसरी ओर, स्तंभों के बहुत सारे मामले हैं, जहाँ मैं इस प्रश्न को जल्दी पूछना सुनिश्चित करूँगा और अगर मुझे तुरंत कठोर और तेज़ उत्तर नहीं मिला, तो मैं स्तंभ को नामवर बना दूँगा।


26

मैं यहाँ एक और उत्तर जोड़ने में संकोच कर रहा हूँ क्योंकि पहले से ही काफी कुछ हैं, लेकिन कुछ बिंदुओं को बनाने की आवश्यकता है जो या तो स्पष्ट नहीं किए गए हैं या स्पष्ट नहीं किए गए हैं।

पहली: क्या नहीं हमेशा उपयोग NVARCHAR। यह एक बहुत ही खतरनाक है, और अक्सर महंगा, दृष्टिकोण / दृष्टिकोण है। और यह कहना बेहतर नहीं है कि " कभी भी कर्सर का उपयोग करें" क्योंकि वे कभी-कभी किसी विशेष समस्या को हल करने का सबसे कुशल साधन होते हैं, और एक WHILEलूप करने के आम काम-के आसपास लगभग हमेशा एक ठीक से किए गए कर्सर की तुलना में धीमा होगा ।

"हमेशा" शब्द का उपयोग करने का एकमात्र समय तब होता है जब "हमेशा वही करें जो स्थिति के लिए सबसे अच्छा हो" की सलाह दे। यह निर्धारित करना कि अक्सर निर्धारित करना मुश्किल होता है, खासकर जब विकास के समय में अल्पकालिक लाभ को संतुलित करने की कोशिश कर रहे हैं (प्रबंधक: "हमें इस सुविधा की आवश्यकता है - जो आपको अभी तक पता नहीं था - एक सप्ताह पहले!") लंबे समय के साथ -टर्म रखरखाव लागत (प्रबंधक, जिन्होंने शुरू में टीम को 3-सप्ताह के स्प्रिंट में 3 महीने की परियोजना को पूरा करने के लिए दबाव डाला था: "हम इन प्रदर्शन समस्याओं को क्यों कर रहे हैं? हम संभवतः एक्स को कैसे कर सकते हैं जिसमें कोई लचीलापन नहीं है? हम बर्दाश्त नहीं कर सकते हैं?" एक स्प्रिंट या दो इसे ठीक करने के लिए। हम एक सप्ताह में क्या कर सकते हैं ताकि हम अपनी प्राथमिकता वाली वस्तुओं को वापस पा सकें? और हमें निश्चित रूप से डिजाइन में अधिक समय बिताने की जरूरत है ताकि ऐसा न हो। ")।

दूसरा: @ gbn का जवाब कुछ महत्वपूर्ण बिंदुओं पर विचार करता है जब कुछ डेटा मॉडलिंग निर्णय लेते समय पथ 100% स्पष्ट नहीं होता है। लेकिन विचार करने के लिए और भी बहुत कुछ है:

  • लेन-देन लॉग फ़ाइलों का आकार
  • दोहराने में समय लगता है (यदि प्रतिकृति का उपयोग कर)
  • ईटीएल में समय लगता है (यदि ETLing)
  • किसी दूरस्थ सिस्टम में लॉग को शिप करने में समय लगता है और पुनर्स्थापित (यदि लॉग शिपिंग का उपयोग कर रहा है)
  • बैकअप का आकार
  • बैकअप पूरा करने में समय की लंबाई है
  • एक पुनर्स्थापना करने में समय की लंबाई है (यह किसी दिन महत्वपूर्ण हो सकता है ;-)
  • tempdb के लिए आवश्यक आकार
  • ट्रिगर्स का प्रदर्शन (सम्मिलित और हटाए गए तालिकाओं के लिए जो टेम्पर्ड में संग्रहीत हैं)
  • पंक्ति संस्करण का प्रदर्शन (यदि स्नैपशॉट का उपयोग कर रहा है, क्योंकि संस्करण स्टोर टेम्पर्ड में है)
  • नई डिस्क स्थान प्राप्त करने की क्षमता जब सीएफओ का कहना है कि उन्होंने पिछले साल सैन पर $ 1 मिलियन खर्च किए थे और इसलिए वे अतिरिक्त भंडारण के लिए $ 250k को अधिकृत नहीं करेंगे
  • INSERT और UPDATE परिचालनों को करने में लंबा समय लगता है
  • सूचकांक अनुरक्षण करने में समय की लंबाई
  • आदि, आदि।

पूरे सिस्टम पर अंतरिक्ष बर्बाद करने का बहुत बड़ा प्रभाव है। मैंने इस विषय पर स्पष्ट विवरण में एक लेख लिखा: डिस्क इज़ सस्ता! औरली? (मुफ्त पंजीकरण की आवश्यकता है, क्षमा करें, मैं उस नीति को नियंत्रित नहीं करता हूं)।

तीसरा: जबकि कुछ उत्तर गलत तरीके से "यह एक छोटा सा ऐप है" पहलू पर ध्यान केंद्रित कर रहे हैं, और कुछ सही ढंग से "उपयोग करने के लिए उपयुक्त है" का सुझाव दे रहे हैं, किसी भी उत्तर ने ओपी को वास्तविक मार्गदर्शन प्रदान नहीं किया है। प्रश्न में वर्णित एक महत्वपूर्ण विवरण यह है कि यह उनके स्कूल के लिए एक वेब पेज है। महान! तो हम सुझाव दे सकते हैं कि:

  • छात्र और / या संकाय नाम के लिए फील्ड्स चाहिए शायद हो NVARCHAR, क्योंकि समय के साथ, यह केवल अधिक संभावना है कि अन्य संस्कृतियों से नाम उन स्थानों में प्रदर्शित किया जाएगा हो रही है।
  • लेकिन सड़क के पते और शहर के नाम के लिए? एप्लिकेशन का उद्देश्य नहीं बताया गया था (यह उपयोगी होगा) लेकिन पते के रिकॉर्ड को मानते हुए, यदि कोई है, तो किसी विशेष भौगोलिक क्षेत्र (यानी एकल भाषा / संस्कृति) से संबंधित है, तो VARCHARउपयुक्त कोड पृष्ठ (जिसका उपयोग करें) क्षेत्र के Collation से निर्धारित होता है)।
  • यदि स्टेट्स और / या देश के ISO कोड्स को स्टोर करना है INT( TINYINTक्योंकि ISO कोड्स को स्टोर करने की जरूरत नहीं है / तय की गई है, तो मानव पठनीय और अच्छी तरह से, मानक :) CHAR(2)दो अक्षर कोड के लिए उपयोग करते हैं और CHAR(3)यदि 3 अक्षर कोड का उपयोग करते हैं। और जैसे कि एक बाइनरी कोलेशन का उपयोग करने पर विचार करें Latin1_General_100_BIN2
  • यदि पोस्टल कोड (यानी ज़िप कोड) को संग्रहीत VARCHARकिया जाता है , तो इसका उपयोग करें क्योंकि यह एक अंतरराष्ट्रीय मानक है जो AZ के बाहर किसी भी पत्र का उपयोग नहीं करता है। और हां, अभी भी उपयोग करें, VARCHARभले ही केवल यूएस पिन कोड स्टोर करें और न कि INT क्योंकि ज़िप कोड नंबर नहीं हैं, वे तार हैं, और उनमें से कुछ में एक अग्रणी "0" है। और जैसे कि एक बाइनरी कोलेशन का उपयोग करने पर विचार करें Latin1_General_100_BIN2
  • यदि ईमेल पते और / या URL संग्रहीत करते हैं, तो NVARCHARउन दोनों का उपयोग करें, जिनमें अब यूनिकोड वर्ण हो सकते हैं।
  • और इसी तरह....

चौथा: अब जब आपके पास NVARCHARडेटा की तुलना में दोगुना स्थान लेने की आवश्यकता है, तो इसके लिए डेटा की आवश्यकता होती है, जो अच्छी तरह से फिट बैठता है VARCHAR("अच्छी तरह से फिट बैठता है" = "में बदल नहीं जाता है?") और किसी भी तरह, जैसे कि जादू से, आवेदन बढ़ता था? और अब इनमें से कम से कम एक क्षेत्र में लाखों रिकॉर्ड हैं जहां अधिकांश पंक्तियां मानक ASCII हैं, लेकिन कुछ में यूनिकोड वर्ण हैं, इसलिए आपको NVARCHARनिम्नलिखित पर विचार करना होगा:

  1. यदि आप SQL Server 2008 - 2016 RTM का उपयोग कर रहे हैं और एंटरप्राइज़ संस्करण पर हैं, या यदि SQL सर्वर 2016 SP1 (जिसने सभी संस्करणों में डेटा संपीड़न उपलब्ध कराया है) या नए का उपयोग कर रहे हैं, तो आप डेटा संपीड़न को सक्षम कर सकते हैं । डेटा संपीड़न (और "हमेशा" नहीं होगा) यूनिकोड डेटा को NCHARऔर NVARCHARफ़ील्ड में संपीड़ित करता है । निर्धारण कारक हैं:

    1. NCHAR(1 - 4000)और यूनिकोड के लिए मानक संपीड़न योजना काNVARCHAR(1 - 4000) उपयोग करें , लेकिन केवल SQL Server 2008 R2 में शुरू हो रहा है, और केवल ROW डेटा के लिए, OVERFLOW नहीं! यह नियमित ROW / PAGE कम्प्रेशन एल्गोरिदम से बेहतर प्रतीत होता है।
    2. NVARCHAR(MAX)और XML(और मैं भी लगता है VARBINARY(MAX), TEXTऔर NTEXT) डेटा में पंक्ति में कम से कम पृष्ठ संकुचित किया जा सकता है, लेकिन (LOB या अतिप्रवाह पृष्ठों में पंक्ति बंद नहीं) है कि नहीं संकुचित पंक्ति। बेशक, पृष्ठ संपीड़न इन-पंक्ति मान के आकार पर निर्भर करता है: मैंने VARCHAR (MAX) के साथ परीक्षण किया और देखा कि 6000 वर्ण / बाइट पंक्तियाँ संपीड़ित नहीं होंगी, लेकिन 4000 वर्ण / बाइट पंक्तियों ने किया।
    3. कोई भी ROW डेटा, LOB या OVERLOW = आपके लिए कोई संपीड़न नहीं!
  2. यदि SQL Server 2005, या 2008 - 2016 RTM और एंटरप्राइज़ संस्करण पर नहीं , तो आपके पास दो फ़ील्ड हो सकते हैं: एक VARCHARऔर एक NVARCHAR। उदाहरण के लिए, मान लें कि आप ऐसे URL संग्रहीत कर रहे हैं जो अधिकतर सभी ASCII वर्ण (मान 0 - 127) हैं और इसलिए इसमें फिट हैं VARCHAR, लेकिन कभी-कभी यूनिकोड वर्ण होते हैं। आपके स्कीमा में निम्नलिखित 3 फ़ील्ड शामिल हो सकते हैं:

      ...
      URLa VARCHAR(2048) NULL,
      URLu NVARCHAR(2048) NULL,
      URL AS (ISNULL(CONVERT(NVARCHAR([URLa])), [URLu])),
      CONSTRAINT [CK_TableName_OneUrlMax] CHECK (
                        ([URLa] IS NOT NULL OR [URLu] IS NOT NULL)
                    AND ([URLa] IS NULL OR [URLu] IS NULL))
    );
    

    इस मॉडल में आप केवल[URL] गणना किए गए कॉलम से चयन करें। डालने और अद्यतन करने के लिए, आप यह निर्धारित करते हैं कि कौन से फ़ील्ड का उपयोग करके देखें कि क्या आने वाले मूल्य को परिवर्तित करता है, जो कि NVARCHARप्रकार का है:

    INSERT INTO TableName (..., URLa, URLu)
    VALUES (...,
            IIF (CONVERT(VARCHAR(2048), @URL) = @URL, @URL, NULL),
            IIF (CONVERT(VARCHAR(2048), @URL) <> @URL, NULL, @URL)
           );
    
  3. आप आने वाले मानों को GZIP में बदल सकते हैं VARBINARY(MAX)और फिर बाहर निकलने पर अनज़िप कर सकते हैं:

    • SQL Server 2005 - 2014 के लिए: आप SQLCLR का उपयोग कर सकते हैं। SQL # (एक SQLCLR लाइब्रेरी जो मैंने लिखी है) Util_GZip और Util_GUnzip के साथ मुफ़्त संस्करण में आती है
    • SQL सर्वर 2016 और नए के लिए: आप अंतर्निहित COMPRESSऔर DECOMPRESSफ़ंक्शंस का उपयोग कर सकते हैं , जो कि GZip भी हैं।
  4. यदि SQL Server 2017 या नए का उपयोग कर रहे हैं, तो आप तालिका को एक Clustered Columnstore Index बनाने में देख सकते हैं।

  5. हालांकि यह एक व्यवहार्य विकल्प नहीं है, लेकिन SQL Server 2019 UTF-8 VARCHAR/ CHARdatatypes के लिए मूल समर्थन का परिचय देता है । इसका उपयोग करने के लिए वर्तमान में इसके साथ बहुत सारे कीड़े हैं, लेकिन यदि वे तय हो गए हैं, तो यह कुछ परिदृश्यों के लिए एक विकल्प है। इस नई सुविधा के विस्तृत विश्लेषण के लिए कृपया मेरी पोस्ट, " मूल निवासी UTF-8 SQL Server 2019 में समर्थन: उद्धारकर्ता या गलत पैगंबर? " देखें।


7
धीमी ताली। बस आश्चर्य है कि "हमेशा nvarchar का उपयोग करें" को 140 वोट मिले और यह नहीं हुआ। इस पद पर महान कार्य।
schizoid04

1
@ schizoid04 धन्यवाद। निष्पक्ष होने के लिए, स्वीकृत उत्तर को 7 साल पहले पोस्ट किया गया था, इसलिए वहां बहुत अधिक ट्रैफ़िक है जिसने उस पर वोट दिया (और / या विभिन्न अन्य) जो फिर से मूल्यांकन करने के लिए वापस नहीं आए। फिर भी, यह वोट-आधारित मंचों को चलाने वाले "भीड़ की समझ" सिद्धांत को एक बहुत ही ठोस प्रतिरूप प्रदान करता है। वहाँ बहुत गलत जानकारी है। उदाहरण के लिए, यह डीबीएएसई पर है। मेरे द्वारा पोस्ट किए जाने से पहले स्वीकार किए गए अन्य उत्तर, परिभाषाओं, भ्रामकताओं की संकीर्णता से "सही" है, और इसमें यह जानकारी भी शामिल है कि मैं अपना अपमान करता हूं, फिर भी यह मेरा है।
सोलोमन रटज़की

22

आपके आवेदन के लिए, nvarchar ठीक है क्योंकि डेटाबेस का आकार छोटा है। "हमेशा नवरचचर का उपयोग करें" कहना एक बहुत बड़ा निरीक्षण है। यदि आपको कांजी या अन्य पागल पात्रों जैसी चीजों को संग्रहीत करने की आवश्यकता नहीं है, तो VARCHAR का उपयोग करें, यह बहुत कम जगह का उपयोग करेगा। मेरी वर्तमान नौकरी पर मेरे पूर्ववर्ती ने NVARCHAR का उपयोग करते हुए कुछ डिज़ाइन किया जब इसकी आवश्यकता नहीं थी। हमने हाल ही में इसे VARCHAR में बदल दिया और सिर्फ 15 बार उस टेबल पर सेव किया (यह अत्यधिक लिखा गया था)। इसके अलावा, अगर आपके पास उस टेबल पर एक इंडेक्स है और आप उस कॉलम को शामिल करना चाहते हैं या कंपोजिट इंडेक्स बनाना चाहते हैं, तो आपने अपनी इंडेक्स फाइल का आकार बड़ा कर दिया है।

बस अपने निर्णय में विचारशील रहें; एसक्यूएल विकास और डेटा परिभाषाओं में शायद ही कभी एक "डिफ़ॉल्ट उत्तर" लगता है (अन्य हर कीमत पर अभिशाप से बचने के अलावा)।


10

चूँकि आपका आवेदन छोटा है, मूल रूप से varchar पर nvarchar का उपयोग करने के लिए कोई सराहनीय लागत वृद्धि नहीं है, और यदि आप यूनिकोड डेटा संग्रहीत करने की आवश्यकता है, तो आप अपने आप को संभावित सिरदर्द से बचाते हैं।


8

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


7

पिछले कुछ वर्षों से हमारी सभी परियोजनाओं में सब कुछ के लिए NVARCHAR का उपयोग किया गया है, क्योंकि ये सभी परियोजनाएँ बहुभाषी हैं। बाहरी स्रोतों (जैसे एक ASCII फ़ाइल, आदि) से आयातित डेटा डेटाबेस में डाले जाने से पहले यूनिकोड में परिवर्तित हो जाता है।

मैं अभी तक किसी भी प्रदर्शन-संबंधित मुद्दों को बड़े अनुक्रमितों आदि से सामना करने के लिए हूं, अनुक्रमणिका अधिक मेमोरी का उपयोग करते हैं, लेकिन स्मृति सस्ता है।

चाहे आप संग्रहीत प्रक्रियाओं का उपयोग करें या मक्खी पर एसक्यूएल का निर्माण सुनिश्चित करें कि सभी स्ट्रिंग स्थिरांक N (जैसे SET @foo = N'Hello दुनिया;) के साथ उपसर्ग कर रहे हैं, इसलिए निरंतर भी यूनिकोड है। यह रनटाइम में किसी भी स्ट्रिंग प्रकार रूपांतरण से बचा जाता है।

YMMV।


4
आपके पास जिन तालिकाओं के साथ काम कर रहे हैं, उनमें संभवतः आपके पास कई सौ मिलियन रिकॉर्ड नहीं हैं। मैं मानता हूं कि अधिकांश एप्स के लिए नवरचचर डिफॉल्ट करना ठीक है, लेकिन सभी के लिए नहीं।
ब्रैंडन मूर

7

मैं इस पर अनुभव से बोल सकता हूं, सावधान रहना nvarchar। जब तक कि आपको इसकी पूरी आवश्यकता न हो, यह डेटा फ़ील्ड प्रकार बड़े डेटाबेस पर प्रदर्शन को नष्ट कर देता है। मुझे एक डेटाबेस विरासत में मिला है जो प्रदर्शन और अंतरिक्ष के मामले में दर्द दे रहा है। हम आकार में 30GB डेटाबेस को 70% तक कम करने में सक्षम थे! प्रदर्शन में मदद करने के लिए कुछ अन्य संशोधन किए गए थे, लेकिन मुझे यकीन है कि varcharइससे काफी मदद मिली। यदि आपके डेटाबेस में टेबल बढ़ने की क्षमता एक मिलियन + रिकॉर्ड है तो nvarcharहर कीमत से दूर रहें ।


4

मैं अक्सर काम पर इस सवाल से निपटता हूं:

  • इन्वेंट्री और मूल्य निर्धारण के एफ़टीपी फीड - आइटम विवरण और अन्य पाठ नवरच में थे जब वर्कर ने ठीक काम किया। इन्हें varchar करने से फ़ाइल का आकार लगभग आधा हो जाता है और वास्तव में अपलोड करने में मदद मिलती है।

  • उपरोक्त परिदृश्य ने ठीक काम किया जब तक कि किसी ने आइटम विवरण में एक विशेष चरित्र नहीं डाला (शायद ट्रेडमार्क, याद नहीं कर सकता)

मैं अभी भी हर बार varchar पर nvarchar का उपयोग नहीं करता हूँ। यदि विशेष पात्रों के लिए कोई संदेह या संभावना है, तो मैं नवरचेर का उपयोग करता हूं। मुझे लगता है कि जब मैं इस क्षेत्र को आबाद कर रहा हूं, तो मैं 100% नियंत्रण में हूं।


3

क्यों, इस सारी चर्चा में, यूटीएफ -8 का कोई उल्लेख नहीं किया गया है? वर्णों की पूर्ण यूनिकोड अवधि को स्टोर करने में सक्षम होने का मतलब यह नहीं है कि किसी को हमेशा दो-बाइट्स-प्रति-चरित्र (या "कोड बिंदु" को यूनिकोड शब्द का उपयोग करने के लिए आवंटित करना पड़ता है)। सभी ASCII UTF-8 हैं। SQL सर्वर VARCHAR () फ़ील्ड के लिए जाँच करता है कि पाठ सख्त ASCII है (यानी शीर्ष बाइट बिट शून्य)? मुझे उम्मीद है कि नहीं होगा।

यदि आप यूनिकोड को स्टोर करना चाहते हैं और पुराने ASCII- केवल अनुप्रयोगों के साथ संगतता चाहते हैं, तो मुझे लगता है कि VARCHAR () और UTF-8 का उपयोग करना जादू की गोली होगी: इसे केवल तब ही अधिक स्थान का उपयोग करना होगा जब इसे आवश्यकता हो।

आप उन लोगों के लिए जो यूटीएफ -8 से अपरिचित हैं, क्या मैं एक प्राइमर की सिफारिश कर सकता हूं ।


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

1
VARCHAR कॉलम में UTF-8 को स्टोर करना संभव नहीं है। MSSQL हमेशा आपके UTF-8 डेटा को कॉलम कोलाज में परिवर्तित करेगा । यदि आप टकराव को गड़बड़ करते हैं (जैसे कि लैटिन 12 में CP1252 को संग्रहीत करने की कोशिश कर रहे हैं) तो रूपांतरण काम नहीं करेगा और आप अपने डेटा में अतिरिक्त बाइट्स के साथ समाप्त हो जाएंगे। जब आप लैटिन_1 को UTF-8 (ऐप की ओर) में परिवर्तित करते हैं और फिर से latin_1 (db साइड) में वापस आते हैं, तो यह ठीक प्रतीत हो सकता है, लेकिन यह सिर्फ एक भ्रम है। आप fbds का उपयोग करके और प्रोटोकॉल को 7 से कम किसी चीज़ पर सेट करके अपने कॉलम कोलाज में कनवर्ट कर रहे DB ऑटो से चुपके कर सकते हैं, लेकिन आप nvarchar को क्वेरी करने की क्षमता खो देते हैं।
चुगदी

1
@chugadie और Tevya: यह उत्तर थोड़ा गैर-निरर्थक है। SQL सर्वर यूनिकोड डेटा (यानी XML और N-prefixed प्रकार) को संग्रहीत करने के लिए केवल UCS-2 / UTF-16 का उपयोग करता है । आपको UTF-8 का उपयोग करने का विकल्प नहीं मिलता है। इसके अलावा, यूनिकोड एनकोडिंग (UTF-8, UCS-2 / UTF-16 और UTF-32) VARCHAR क्षेत्रों पर लागू नहीं किए जा सकते हैं।
सोलोमन रटज़की

2

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


1

आप उपयोग कर रहे हैं NVARCHARसिर्फ इसलिए कि एक प्रणाली संग्रहीत प्रक्रिया यह आवश्यकता है, सबसे लगातार घटना बेवजह किया जा रहा है sp_executesql, और अपने गतिशील एसक्यूएल बहुत लंबा है, तो आप में सभी स्ट्रिंग जोड़तोड़ (संयोजन, प्रतिस्थापन आदि) कर बेहतर बंद होगा प्रदर्शन के नजरिए से VARCHARतो परिवर्तित अंतिम परिणाम के लिए NVARCHARऔर यह खरीद पैरामीटर में खिला। तो नहीं, हमेशा उपयोग न करें NVARCHAR!

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