2012-01-25 9 views
5

जबकि researching options एसक्यूएल सर्वर डेटाबेस में अधिकतर अंग्रेजी-लेकिन-कभी-कभी डेटा संग्रहीत करने के लिए संभवतः काफी बड़ा नहीं हो सकता है, तो मैं सबसे अधिक स्ट्रिंग डेटा को यूटीएफ -8 एन्कोडेड के रूप में संग्रहीत करने की ओर झुका रहा हूं।यूसीएस -2 और एसक्यूएल सर्वर

हालांकि, माइक्रोसॉफ्ट ने यूसीएस -2 को उन कारणों से चुना है जिन्हें मैं पूरी तरह समझ नहीं पा रहा हूं जो मुझे दूसरे अनुमान लगाते हैं कि झुकाव। SQL सर्वर 2012 के लिए प्रलेखन दिखाता है कि UTF-8 UDT कैसे बनाएं, लेकिन यूसीएस -2 के लिए निर्णय संभावित रूप से SQL सर्वर में फैलता है।

Wikipedia (जो दिलचस्प लिखते हैं कि यूसीएस -2 UTF-16 के पक्ष में अप्रचलित है) नोट UTF-8 एक चर-चौड़े वर्णों की किसी भी यूनिकोड डेटा बिंदु एन्कोडिंग करने में सक्षम सेट और यह provides the de facto standard encoding for interchange of Unicode text कि है। इसलिए, ऐसा लगता है कि यूटीएफ -8 में किसी भी यूनिकोड चरित्र का प्रतिनिधित्व किया जा सकता है, और चूंकि अधिकांश टेक्स्ट अंग्रेजी होंगे, इसलिए यूसीएस -2 के साथ प्रतिनिधित्व कॉम्पैक्ट के रूप में लगभग दोगुना होगा (मुझे पता है कि डिस्क "सस्ता" है, लेकिन डिस्क कैश है टी, और मेमोरी डेटा आकारों की तुलना में नहीं है, जिनके साथ मैं काम कर रहा हूं। कई ऑपरेशन तेजी से घटते हैं जब कामकाजी सेट उपलब्ध रैम से बड़ा होता है)।

यूसीएस -2 स्ट्रीम को तैरने से मुझे क्या समस्याएं आ सकती हैं?

+0

विंडोज 2012 पर एसक्यूएल सर्वर 2012 रैम के 4TB तक का समर्थन करेगा। आम तौर पर कोड को बेहतर बनाने के लिए किसी को नियोजित करने से रैम खरीदने के लिए सस्ता है। यह सिर्फ एक सुझाव है। – Ben

+0

मैंने एक नई प्रणाली के लिए आर्किटेक्चर पर निर्णय लेने के दौरान सवाल पूछा। ऐसे प्रश्न पूछने का यह आदर्श समय है। चाहे रैम या कोडिंग प्रयास सस्ता है, आपकी समस्या के पैमाने पर निर्भर करता है। यदि Google अपनी डिस्क और रैम को कटौती करने के लिए कुछ हफ्तों तक एक प्रोग्रामर को नियोजित कर सकता है, तो यह एक बुद्धिमान निवेश होगा। –

+0

ठीक है अच्छा बिंदु :-) मैं इस तरह के बड़े सिस्टम पर काम नहीं कर रहा हूं। मेरे लिए ऐसे प्रश्न आसान हैं। :-) – Ben

उत्तर

9

ज्यादातर-अंग्रेजी बल्कि कभी कभी-न एक एसक्यूएल सर्वर डेटाबेस में डेटा है कि संभवतः काफी बड़ा हो सकता है, मैं UTF-8 एन्कोडेड के रूप में सबसे स्ट्रिंग डेटा भंडारण की ओर झुकाव रहा हूँ भंडारण। 8 बिट ASCII में

कुछ अन्य RDBMS के कि कोई एन्कोडिंग, एसक्यूएल सर्वर भंडार यूनिकोड डेटा केवल UTF-16 (लिटल एन्डियन) में को चुनने के लिए अनुमति देने के विपरीत, और गैर-यूनिकोड डेटा जो कुछ के लिए कोड पृष्ठ निहित है क्षेत्र के कोलेक्शन द्वारा।

माइक्रोसॉफ्ट कारण है कि मैं पूरी तरह से समझ में नहीं आता के लिए यूसीएस -2 चुना

को उनके निर्णय चुनें यूसीएस -2 समझ में आता है पर्याप्त यह देखते हुए कि UTF-16 के 1996 के मध्य में शुरू की गई थी और 2000 में पूरी तरह से निर्दिष्ट।कई अन्य सिस्टम इसका उपयोग (या उपयोग) भी करते हैं (कृपया देखें: https://en.wikipedia.org/wiki/UTF-16#Usage)। पर उनका निर्णय जारी है और यह अधिक संदिग्ध हो सकता है, हालांकि यह शायद विंडोज और .NET के कारण यूटीएफ -16 है। बाइट्स का भौतिक लेआउट यूसीएस -2 और यूटीएफ -16 के बीच समान है, इसलिए यूटीएफ -16 का समर्थन करने के लिए यूसीएस -2 से सिस्टम को अपग्रेड करना पूरी तरह से कार्यात्मक होना चाहिए, किसी भी मौजूदा डेटा को बदलने की जरूरत नहीं है।

एसक्यूएल सर्वर 2012 के लिए प्रलेखन एक UTF-8 UDT बनाने का तरीका दिखाता है,

उम, नहीं। SQLCLR के माध्यम से एक कस्टम उपयोगकर्ता-परिभाषित प्रकार बनाना नहीं है, किसी भी तरह से, आपको किसी मूल प्रकार के प्रतिस्थापन के लिए जा रहा है। विशेष डेटा को संभालने के लिए कुछ बनाने के लिए यह बहुत आसान है। लेकिन तार, एक अलग एन्कोडिंग के भी, विशेष से बहुत दूर हैं। अपने स्ट्रिंग डेटा के लिए इस रूट पर जाने से आपके सिस्टम की उपयोगिता की कोई भी मात्रा नष्ट हो जाएगी, प्रदर्शन का उल्लेख न करें क्योंकि आप किसी भी अंतर्निहित स्ट्रिंग फ़ंक्शंस का उपयोग करने में सक्षम नहीं होंगे। यदि आप डिस्क स्पेस पर कुछ भी सहेजने में सक्षम थे, तो उन लाभों को मिटा दिया जाएगा जो आप समग्र प्रदर्शन में खो देंगे। एक यूडीटी भंडारण इसे VARBINARY पर क्रमबद्ध करके किया जाता है। तो करने के लिए किसी भी स्ट्रिंग तुलना या सॉर्टिंग, "बाइनरी"/"ऑर्डिनल" तुलना के बाहर, आपको अन्य सभी मानों को एक-एक करके, यूटीएफ -8 में परिवर्तित करना होगा, फिर स्ट्रिंग की तुलना करें भाषाई मतभेदों का विवरण हो सकता है।

इसके अलावा, "प्रलेखन" वास्तव में केवल नमूना कोड/अवधारणा सामग्री का सबूत है। कोड 2003 (http://msftengprodsamples.codeplex.com/SourceControl/latest#Kilimanjaro_Trunk/Programmability/CLR/UTF8String/CS/UTF8String/Utf8String.cs) में SQL Server 2005 के लिए लिखा गया था। मैंने कार्यक्षमता का परीक्षण करने के लिए एक स्क्रिप्ट देखी, लेकिन प्रदर्शन से जुड़े कुछ भी नहीं।

लेकिन यूसीएस -2 के लिए निर्णय संभावित रूप से SQL सर्वर में फैलता है।

हां, बहुत कुछ। डिफ़ॉल्ट रूप से, अंतर्निहित कार्यों का प्रबंधन केवल यूसीएस -2 के लिए होता है। लेकिन एसक्यूएल सर्वर 2012 में शुरू करने से, आप उन्हें पूर्ण यूटीएफ -16 चरित्र सेट (अच्छी तरह से, यूनिकोड संस्करण 5 या 6 के रूप में, अपने ओएस और .NET Framework के संस्करण के आधार पर) को कॉल करने में से एक का उपयोग कर प्राप्त कर सकते हैं। का नाम _SC (यानी पूरक वर्ण) में समाप्त हो रहा है।

विकिपीडिया ... लिखते हैं कि यूसीएस -2 UTF-16

सही के पक्ष में अप्रचलित है। यूटीएफ -16 और यूसीएस -2 दोनों 2-बाइट कोड पॉइंट्स का उपयोग करते हैं। लेकिन यूटीएफ -16 अतिरिक्त पात्रों को मैप करने के लिए उनमें से कुछ जोड़े (यानी सरोगेट जोड़े) का उपयोग करता है। इन जोड़े के लिए उपयोग किए गए कोड बिंदु इस उद्देश्य के लिए यूसीएस -2 में आरक्षित हैं और इसलिए किसी भी प्रयोग करने योग्य प्रतीकों को मैप करने के लिए उपयोग नहीं किया जाता है। यही कारण है कि आप SQL सर्वर में किसी भी यूनिकोड वर्ण को स्टोर कर सकते हैं और इसे सही तरीके से संग्रहीत और पुनर्प्राप्त किया जाएगा।

विकिपीडिया ... नोट UTF-8, एक चर-चौड़े वर्णों की किसी भी यूनिकोड डेटा बिंदु

सही एन्कोडिंग करने में सक्षम सेट किया गया है कि हालांकि भ्रामक। हां, यूटीएफ -8 चर-चौड़ाई है, लेकिन यूटीएफ -16 भी मामूली रूप से परिवर्तनीय है क्योंकि सभी पूरक वर्ण दो डबल-बाइट कोड बिंदुओं से बने होते हैं। इसलिए यूटीएफ -16 प्रति प्रतीक 2 या 4 बाइट्स का उपयोग करता है, हालांकि यूसीएस -2 हमेशा 2 बाइट होता है। लेकिन यह भ्रामक हिस्सा नहीं है। भ्रामक क्या है यह निहितार्थ है कि कोई अन्य यूनिकोड एन्कोडिंग अन्य सभी कोड बिंदुओं को एन्कोड करने में सक्षम नहीं है। जबकि यूसीएस -2 उन्हें पकड़ सकता है लेकिन उन्हें समझ नहीं सकता है, यूटीएफ -16 और यूटीएफ -32 दोनों यूटीएफ -8 की तरह सभी यूनिकोड कोड पॉइंट्स को मैप कर सकते हैं।

और यह [ed: UTF-8] यूनिकोड टेक्स्ट के आदान-प्रदान के लिए वास्तविक तथ्य एन्कोडिंग प्रदान करता है।

यह सच हो सकता है, लेकिन यह एक परिचालन परिप्रेक्ष्य से पूरी तरह से अप्रासंगिक है।

यह किसी भी यूनिकोड वर्ण की तरह लगता है UTF-8 में व्यक्त किया जा सकता

फिर, सच है, लेकिन पूरी तरह से अप्रासंगिक के बाद से UTF-16 और UTF-32 भी सभी यूनिकोड कोड अंक मैप करें।

के बाद से सबसे अधिक पाठ अंग्रेजी हो जाएगा, प्रतिनिधित्व के साथ यूसीएस-2

परिस्थितियों में यह बहुत अच्छी तरह से सच हो सकता है पर निर्भर करता है के रूप में लगभग दो बार के रूप में कॉम्पैक्ट हो जाएगा, और आप के बारे में चिंतित होने की सही हैं इस तरह के अपशिष्ट उपयोग। हालांकि, जैसा कि मैंने इस प्रश्न में उल्लेख किया है कि इस (UTF-8 Support, SQL Server 2012 and the UTF8String UDT) की ओर अग्रसर है, यदि आपके पास VARCHAR में फिट हो सकती है तो कुछ स्थानों को बर्बाद करने के लिए कुछ विकल्प हैं, फिर भी कुछ को NVARCHAR होने की आवश्यकता है। सबसे अच्छा विकल्प रो कंप्रेशन या पेज कंप्रेसर (एंटरप्राइज़ एडिटन केवल!) को सक्षम करना है। एसक्यूएल सर्वर 2008 आर 2 में शुरू होने से, वे गैर-MAX NVARCHAR फ़ील्ड को "यूनिकोड के लिए मानक संपीड़न योजना" का उपयोग करने की अनुमति देते हैं जो कम से कम यूटीएफ -8 के रूप में अच्छा है, और कुछ मामलों में यह यूटीएफ -8 से भी बेहतर है। NVARCHAR(MAX) फ़ील्ड इस फैंसी संपीड़न का उपयोग नहीं कर सकते हैं, लेकिन उनके IN ROW डेटा नियमित ROW और/या पृष्ठ संपीड़न से लाभ उठा सकते हैं। डेटा संपीड़न सक्षम के साथ कृपया इस संपीड़न के विवरण और डेटा आकार की तुलना में कच्चे यूसीएस -2/यूटीएफ -16, यूटीएफ -8, और यूसीएस -2/यूटीएफ -16 के विवरण के लिए निम्नलिखित देखें।

SQL Server 2008 R2 - UCS2 compression what is it - Impact on SAP systems

भी वहाँ के रूप में कुछ प्रतिबंध (यह केवल एंटरप्राइज़ संस्करण में उपलब्ध होने से परे) और कुछ परिस्थितियों जब संपीड़न चीजों को बदतर बनाने के हो सकता है अधिक जानकारी के लिए Data Compression के लिए MSDN पेज देखें।

मैं जानता हूँ कि डिस्क "सस्ते"

कि बयान की सच्चाई कैसे एक को परिभाषित करता है "डिस्क" पर निर्भर करता है। यदि आप कमोडिटी पार्ट्स के मामले में बात कर रहे हैं कि आप अपने डेस्कटॉप/लैपटॉप में उपयोग के लिए स्टोर में शेल्फ को खरीद सकते हैं, तो सुनिश्चित करें। लेकिन, अगर एंटरप्राइज़-स्तरीय स्टोरेज के मामले में बात की जा रही है जिसका उपयोग आपके प्रोडक्शन सिस्टम के लिए किया जाएगा, तो मज़ेदार है कि जो भी बजट को नियंत्रित करता है उसे समझाने के लिए कि उन्हें मिलियन-प्लस-डॉलर SAN को अस्वीकार नहीं करना चाहिए क्योंकि यह "सस्ता है" ";-)।

यूसीएस -2 स्ट्रीम को तैरने से मुझे क्या समस्याएं आ सकती हैं?

कोई भी जिसे मैं सोच सकता हूं। खैर, जब तक कि आप उस यूडीटी को लागू करने जैसे कुछ करने के लिए किसी भी भयानक सलाह का पालन नहीं करते हैं, या सभी स्ट्रिंग्स को VARBINARY में परिवर्तित करते हैं, या सभी स्ट्रिंग फ़ील्ड के लिए NVARCHAR(MAX) का उपयोग करते हैं ;-)। लेकिन उन सभी चीजों में से आप चिंता कर सकते हैं, यूसीएस -2/यूटीएफ -16 का उपयोग कर एसक्यूएल सर्वर उनमें से एक नहीं होना चाहिए।

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

0

"यूसीएस -2 स्ट्रीम को तैरने" का क्या मतलब है?

  • उपयोग नए 2012 _SC collations (https://msdn.microsoft.com/en-us/library/ms143726.aspx):

    यहाँ अपने विकल्प हैं। यह विचार srutzky से आता है। आपको उसका जवाब देखना चाहिए। यह अब तक का सबसे अच्छा समाधान है।

नहीं सुझाया गया लेकिन संभव:

  • लागू एक UDT। यह बहुत काम करेगा और आप टोलिंग समर्थन को खो देंगे (या मैपिंग और निश्चित रूप से कुछ एसक्यूएल सर्वर फीचर्स जो देशी प्रकारों पर काम करते हैं)।
  • varbinary (अधिकतम) का उपयोग करें: आपको कस्टम रूपांतरण कोड करने की आवश्यकता है। कोई रेंज अनुक्रमण नहीं।
  • nvarchar (एन) का उपयोग करें और पंक्ति संपीड़न चालू करें। एसक्यूएल सर्वर 2008 आर 2 से शुरू होने से यह एक एन्कोडिंग का उपयोग करेगा जो यूटीएफ -8 के रूप में कॉम्पैक्ट है। लेकिन इसके लिए एंटरप्राइज़ संस्करण की आवश्यकता है।

इन दृष्टिकोणों के गंभीर दोषों के बारे में पढ़ने के लिए टिप्पणियां देखें।

+1

"स्ट्रीम अप स्विमिंग" करके, मेरा मतलब है कि एमएससी -2 में स्ट्रिंग को एन्कोड करने के लिए डिजाइन निर्णय से लड़ना है। आप कॉलम परिभाषाओं के (एन) संस्करण बनाम (अधिकतम) संस्करणों की अनुशंसा क्यों करते हैं? क्या (अधिकतम) संभावित रूप से धीमा नहीं है? http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/ –

+0

विभिन्न संस्करण समान रूप से तेज़ होते हैं बशर्ते आप उनमें एक ही स्ट्रिंग डाल दें। यदि आप लंबे कॉलम में लंबे तार डालते हैं, तो आप निश्चित रूप से खराब प्रदर्शन प्राप्त करते हैं। आंतरिक रूप से, गिनती प्रकार पैरामीटर को int16 के रूप में कार्यान्वित किया जाता है जो प्रत्येक ऐसे कॉलम को उपसर्ग कर रहा है। मुझे कोई मामला नहीं पता है जिसमें अधिकतम गिनती परिवर्तन बदल रहा है। – usr

+0

मेरी समझ यह है कि (MAX) संस्करणों के डेटा को डेटा डेटा से संग्रहीत किया जाता है, संभावित रूप से अन्य डिस्क की तलाश होती है। मुझे लगता है कि साझा किए गए लिंक से प्रदर्शन संख्याओं की जड़ है। क्या आपके पास ऐसा संदर्भ है जो प्रदर्शन का समर्थन करता है? –

संबंधित मुद्दे