अभी भी एक varchar डेटा प्रकार क्यों है?


36

मेरे कई डेटाबेस में फ़ील्ड को varchars के रूप में परिभाषित किया गया है। अमेरिका में रहने और काम करने के बाद से यह बहुत समस्या नहीं रही है (जहाँ एकमात्र भाषा जो मौजूद है वह "अमेरिकन" है। अहम )

लगभग 5 वर्षों के लिए डेटाबेस के साथ काम करने के बाद, मैंने पाया है कि मैं अंततः varchar क्षेत्र की सीमित प्रकृति के साथ समस्याओं में चला जाता हूं और मुझे अपने खेतों को डेटा को nvarchars के रूप में संग्रहीत करने के लिए संशोधित करना होगा। तालिका को एक और अद्यतन करने के बाद, एक varchar क्षेत्र को एक nvarchar में परिवर्तित करने के बाद, मुझे सिर्फ यह सोचना था- हम अभी भी इसे इस तरह से क्यों कर रहे हैं? मैंने लंबे समय से अपने सभी पाठ फ़ील्ड को nvarchar में परिभाषित करने के लिए मानसिक निर्णय लिया है, बजाय varchar के, जो कि मैंने अपनी पाठ्य पुस्तकों से करना सीखा है जब मैं 10 साल पहले स्कूल में था।

यह 2011 का है और पिछले साल SQL सर्वर की एक नई रिलीज़ हुई थी। जब हम nvarchar का उपयोग कर सकते हैं तो हमें एक varchar डेटाटाइप का समर्थन क्यों जारी रखना चाहिए?

मुझे पता है कि अक्सर यह तर्क दिया जाता है कि नवरचर्स, "दो बार बड़े" के रूप में होते हैं, इसलिए भंडारण स्थान का उपयोग मैकरिंग वार्कर्स के लिए एक तर्क हो सकता है।

हालाँकि, आज के उपयोगकर्ता अपने UTV-8 को डिफॉल्ट UTF-16 के बजाय डेटा स्टोर करने के लिए परिभाषित कर सकते हैं यदि वे स्टोरेज स्पेस को बचाना चाहते हैं। यह 8-बिट एन्कोडिंग के लिए अनुमति देता है अगर यह मुख्य रूप से वांछनीय है, जबकि यह आश्वासन देते हुए कि दुर्लभ 2-8 बाइट चरित्र जो उनके DB में डाला जाता है, कुछ भी नहीं टूटेगा।

क्या मैं कुछ भूल रहा हूँ? क्या कोई अच्छा कारण है कि यह पिछले 15-20 वर्षों में नहीं बदला है?

जवाबों:


37
  1. वर्चुर काम कुछ पश्चिमी मुद्दों के अधीन पश्चिमी यूरोपीय भाषाओं (नार्वे, डेनिश, जर्मन, फ्रेंच, डच आदि) के लिए काफी अच्छा है

  2. इसे देखें SO varchar vs nvarchar के प्रदर्शन में nvarchar के गंभीर प्रदर्शन निहितार्थ हैं

  3. यह MDY बनाम DMY तिथियों से निपटने की तुलना में मामूली है


23

मानकों और अनुकूलता को संबोधित करने वाले उत्तरों के अलावा, किसी को प्रदर्शन को भी ध्यान में रखना चाहिए। जबकि डिस्क स्थान आसानी से सस्ते के रूप में स्वीकार किया जाता है, डीबीए / डेवलपर्स अक्सर इस तथ्य को अनदेखा करते हैं कि क्वेरी प्रदर्शन कई बार सीधे तालिका के पंक्ति / पृष्ठ आकार से संबंधित होता है। का उपयोग NVARCHARकरने के बजाय VARCHAR(जब अनावश्यक) को प्रभावी ढंग से अपने चरित्र क्षेत्रों के लिए पंक्ति आकार दोगुना होगा। यदि आपके पास 5 या 10 50-लंबाई वाले क्षेत्र हैं, तो आप संभावित रूप से प्रति पंक्ति 500 ​​अतिरिक्त बाइट्स जोड़ने की बात कर रहे हैं। यदि आपके पास एक विस्तृत तालिका है, तो यह प्रत्येक पंक्ति को कई पृष्ठों में धकेल सकती है और प्रदर्शन पर प्रतिकूल प्रभाव डाल सकती है।


17

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

VARCHAR और NVARCHAR दोनों ISO Standard SQL का हिस्सा हैं। SQL सर्वर में VARCHAR समर्थन को हटाना या घटाना संगतता और पोर्टेबिलिटी में एक कदम पीछे होगा।


16

वैकल्पिक रूप से, आज के उपयोगकर्ता अपने nvarchars को डिफॉल्ट UTF-16 के बजाय डेटा को स्टोर करने के लिए परिभाषित कर सकते हैं यदि वे स्टोरेज स्पेस को बचाना चाहते हैं।

यह वही है जो ज्यादातर ओपन-सोर्स डेटाबेस के साथ करता है VARCHAR

  • MySQL प्रदान करता है utf8और ucs2"कोलाजेशन" करता है।
  • SQLite आपको UTF-8 (डिफ़ॉल्ट) और UTF-16 के बीच एक विकल्प देता है।
  • PostgreSQL UTF-8 (लेकिन UTF-16 नहीं) का समर्थन करता है।

दो अलग-अलग स्ट्रिंग प्रकारों की आवश्यकता नहीं है।

Microsoft अपने दृष्टिकोण से अजीब है कि 8-बिट स्ट्रिंग्स लीगेसी एन्कोडिंग और यूनिकोड = UTF-16 के लिए हैं। जो शायद विंडोज एपीआई से ही संबंधित है charऔर wchar_tइस तरह से संबंधित है।


15

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

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