2009-04-30 15 views
5

में UTF-16/यूनिकोड डेटा संग्रहीत this के अनुसार, SQL Server 2K5 आंतरिक रूप से UCS-2 का उपयोग करता है। यह यूसीएस -16 में यूटीएफ -16 डेटा (उचित डेटा प्रकारों, नाचर इत्यादि के साथ) स्टोर कर सकता है, हालांकि यदि कोई पूरक चरित्र है तो इसे 2 यूसीएस -2 अक्षरों के रूप में संग्रहीत किया जाता है।SQL सर्वर

यह स्ट्रिंग फ़ंक्शंस के साथ स्पष्ट समस्याएं लाता है, अर्थात् एक वर्ण को SQL सर्वर द्वारा 2 के रूप में माना जाता है।

मुझे कुछ आश्चर्य है कि SQL सर्वर मूल रूप से केवल यूसीएस -2 को संभालने में सक्षम है, और इससे भी अधिक यह कि यह SQL 2K8 में तय नहीं है। मैं सराहना करता हूं कि इनमें से कुछ पात्र सामान्य नहीं हो सकते हैं।

लेख में सुझाए गए कार्यों के अलावा, SQL सर्वर 2K5 में (टूटा हुआ) स्ट्रिंग फ़ंक्शन और यूटीएफ -16 डेटा से निपटने के लिए सर्वोत्तम दृष्टिकोण पर कोई सुझाव।

+0

क्या स्ट्रिंग फ़ंक्शन टूटा हुआ है? – gbn

+3

एलईएन स्ट्रिंग में यूसीएस -2 अक्षरों की संख्या वापस करेगा, यूटीएफ -16 अक्षरों की संख्या नहीं। सब्सट्रिंग यूटीएफ -16 अक्षरों को आधा में विभाजित करेगा। बाएं और दाएं के लिए चला जाता है। अप्पर और लोअर शायद तोड़ देगा। रिवर्स निश्चित रूप से तोड़ देगा। CHARINDEX और PATINDEX भी। डिफेंसेंस और स्टफ के बारे में निश्चित नहीं है। तो उनमें से बहुत सारे .... –

+2

इसे इंगित करने के लिए धन्यवाद। तथ्य यह है कि यह सभी यूनिकोड वर्णों का समर्थन नहीं करता है इसका मतलब है कि कुछ यूटीएफ -16 स्ट्रिंग मान (उदा। विंडोज या .NET से) सत्यापन के बिना SQL सर्वर में डंप करने के लिए मान्य नहीं हैं। किसी भी एप्लिकेशन को बग-फ्री और तकनीकी रूप से सही होने के लिए (कैसे बग-कारण वर्णों में कठिनाई होती है, जहां तक ​​शुद्धता जाती है), सभी तारों को पहले UCS-2-संगत वर्ण रखने के लिए सत्यापित किया जाना चाहिए एसक्यूएल सर्वर में संग्रहीत किया जा रहा है। आश्चर्यजनक! मेरा काम इतना कठिन माइक्रोसॉफ्ट बनाने का तरीका है। – Triynko

उत्तर

2

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

तो, जब तक आप अपने कोड में उचित कार्यों का उपयोग करते हैं, तब तक सबकुछ पारदर्शी रूप से कार्य करना चाहिए।

संपादित: बस की दोबारा जांच कर Books Online, यूनिकोड डेटा seemlessly स्ट्रिंग कार्यों के साथ एसक्यूएल सर्वर के बाद से काम किया है 2000

संपादित 2: जैसा कि टिप्पणी में कहा, एसक्यूएल सर्वर की स्ट्रिंग कार्यों का समर्थन नहीं करते विमान के बाहर सरोगेट्स को पार करने के लिए समर्थन की कमी के कारण पूर्ण यूनिकोड चरित्र सेट 0 (या, दूसरे शब्दों में, SQL सर्वर के स्ट्रिंग फ़ंक्शन केवल प्रति वर्ण 2 बाइट्स को पहचानते हैं।) SQL सर्वर डेटा को सही तरीके से स्टोर और वापस कर देगा, हालांकि कोई भी स्ट्रिंग फ़ंक्शन जो वर्ण गणनाओं पर निर्भर करता है, अपेक्षित मान वापस नहीं करेगा। ऐसा लगता है कि इसे बाईपास करने का सबसे आम तरीका या तो SQL सर्वर के बाहर स्ट्रिंग को संसाधित करना या अन्यथा यूनिकोड जागरूक स्ट्रिंग प्रोसेसिंग फ़ंक्शंस जोड़ने के लिए सीएलआर एकीकरण का उपयोग करना प्रतीत होता है। जोड़ने के लिए

+5

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

+0

यह केवल मानक परिभाषित भाषाओं के बाहर के पात्रों के लिए है। श्वेतपत्र कहता है कि यह मुख्य रूप से ऐतिहासिक भाषाओं के लिए है। – Rick

+0

संपादन पर टिप्पणी: SQL सर्वर UCS-2 यूनिकोड डेटा पर ठीक काम करता है। यूसीएस -2 एक बहिष्कृत मानक है, विंडोज़ ने Win2K के बाद आंतरिक रूप से यूटीएफ -16 का उपयोग किया है। –

-2

कुछ, कि मैं सिर्फ मुश्किल तरीके से सीखा:

अगर आप का उपयोग एक "n" ओरेकल में क्षेत्र (चल im 9i), और .net OracleClient के माध्यम से इसे उपयोग कर सकते हैं, यह है कि केवल पैरामिट्रीकृत लगता है एसक्यूएल काम करेगा ... अगर आपके पास कुछ इनलाइन एसक्यूएल है तो एन'स्ट्रिंग 'यूनिकोड उपसर्ग चाल नहीं लगता है।

और "काम" से, मेरा मतलब है: यह किसी भी अक्षर को आधार वर्णसेट द्वारा समर्थित नहीं खो देगा। तो मेरे उदाहरणों में, अंग्रेजी वर्ण ठीक काम करते हैं, सिरिलिक प्रश्न चिह्न/कचरे में बदल जाता है। http://forums.oracle.com/forums/thread.jspa?threadID=376847

आश्चर्य अगर ORA_NCHAR_LITERAL_REPLACE चर कनेक्शन स्ट्रिंग या कुछ में सेट किया जा सकता:

इस विषय पर एक समग्र चर्चा है।

+0

हाय बूमहौयर, सवाल माइक्रोसॉफ्ट एसक्यूएल सर्वर के बारे में था। आपका उत्तर कहीं और उपयोगी हो सकता है। –

+0

वाह ... यहाँ कुछ हुआ। क्या मैंने गलत सवाल पर पोस्ट किया? मुझे आश्चर्य है कि अगर एसओ ने इसे खराब कर दिया है, क्योंकि यह 2010 के बाद से आसपास रहा है ... –

+0

वास्तव में, मुझे पता है कि यह उत्तर किसी अन्य प्रश्न पर होता है! –

5

एसक्यूएल सर्वर 2012 अब सरोगेट जोड़े सहित यूटीएफ -16 का समर्थन करता है। http://msdn.microsoft.com/en-us/library/ms143726(v=sql.110).aspx देखें, विशेष रूप से "अनुपूरक पात्र" खंड।

तो मूल समस्या के लिए एक फिक्स SQL ​​सर्वर 2012 को अपनाना है।

+0

जबकि सच है कि SQL Server 2012 ने '_SC' कॉलेशन पेश किए हैं जिनके पूरक पूरकों का उचित संचालन है, प्रश्न SQL Server 2005 से संबंधित _very_ विशिष्ट है। इसके अलावा, यह यूटीएफ -16 के बाद से "यूटीएफ -16 + सरोगेट जोड़े" नहीं है = "यूसीएस -2 + सरोगेट जोड़े"। –