SQL Server डेटाबेस में UTF-8 Collation का उपयोग कैसे करें?


84

मैंने mysql से SQL Server (राजनीति), मूल mysql डेटाबेस से UTF8 का उपयोग करके एक डेटाबेस माइग्रेट किया है।

अब मैं /dba/7346/sql-server-2005-2008-utf-8-collation-charset पढ़ता हूं कि SQL Server 2008 utf8 का समर्थन नहीं करता है, क्या यह मजाक है?

SQL सर्वर कई डेटाबेस को होस्ट करता है, जिसमें ज्यादातर लैटिन-एनकोडेड होता है। चूंकि वेब प्रकाशन के लिए माइग्रेटेड डीबी का इरादा है, इसलिए मैं utf8-एन्कोडिंग रखना चाहता हूं। क्या मुझे कुछ छूट गया है या मुझे आवेदन स्तर पर एनकाउंटर / डिक्री की आवश्यकता है?


असल में SQLCLR UDF बनाकर UTF8 का उपयोग करने में कोई समस्या नहीं है, और आप Microsoft से कोड डाउनलोड कर सकते हैं। इस लिंक की जाँच करें: Technet.microsoft.com/en-us/library/ms160893(v=sql.90).aspx
Ronen Ariely

1
यह देखते हुए कि जावा, जावास्क्रिप्ट, डॉटनेट और विंडोज सभी यूटीएफ -16 का आंतरिक रूप से उपयोग करते हैं, इसलिए यदि आपकी वेबसाइट को उनमें से किसी में कोडित किया जाना है तो आप यूटीएफ 16 में रूपांतरण को सहेज रहे हैं।
बेन

1
यदि यह मदद करता है, तो आप दिखा सकते हैं कि SQL सर्वर आंतरिक रूप से पाठ को UTF-8 के रूप में संग्रहीत करता है; और जब आप इसे पुनः प्राप्त करते हैं तो चालक इसे वापस UTF-16 में बदल देता है। आप यह भी दिखा सकते हैं कि SQL सर्वर पाठ को UCS-32 के रूप में संग्रहीत करता है। आंतरिक भंडारण प्रारूप एक अप्रासंगिक कार्यान्वयन विवरण है। यह महत्वपूर्ण है कि डेटाबेस यूटीएफ -16 (आपके प्रोग्रामिंग वातावरण से मेल खाते) के रूप में यूनिकोड चरित्र डेटा लौटाते हैं।
इयान बॉयड

जवाबों:


26

नहीं! यह एक मजाक नहीं है।

यहां देखें: http://msdn.microsoft.com/en-us/library/ms186939.aspx

वर्ण डेटा प्रकार जो निश्चित-लंबाई, nchar या चर-लंबाई, nvarchar, यूनिकोड डेटा हैं और UNICODE UCS-2 वर्ण सेट का उपयोग करते हैं।

और यहां भी: http://en.wikipedia.org/wiki/UTF-16

पुराने UCS-2 (2-बाइट यूनिवर्सल कैरेक्टर सेट) एक समान वर्ण एन्कोडिंग है जो जुलाई 1996 में यूनिकोड मानक के संस्करण 2.0 में UTF-16 द्वारा दिया गया था।


ठीक। क्या mssql- क्लाइंट बाहरी UTF8- दुनिया में अनुवाद कर सकता है?
सेप

mssql-clientसब कुछ हो सकता है। जावा, .NET, C, PHP, आदि ... क्लाइंट के साथ क्या मतलब है?
14

1
क्लाइंट: php के तहत sqlsrv एक्सटेंशन। रॉबर्ट इसे स्पष्ट पाठ यहाँ डालता है: social.msdn.microsoft.com/Forums/en/sqldriverforphp/thread/… , परिणामों का मूल्यांकन और पोस्ट करेगा।
टेसन

2
हाय फिर, देरी के लिए खेद है, लेकिन प्रतिनिधि के लिए धन्यवाद sqlsrv_connect (, सरणी, ("CharacterSet" => "UTF-8") का उपयोग करके .. कनेक्शन स्ट्रिंग में ठीक काम करता है। PDO बाहर है, ठीक है?
टेस्ला

33

UTF-8 एक वर्ण सेट नहीं है, यह एक एन्कोडिंग है। यूटीएफ -8 के लिए निर्धारित चरित्र यूनिकोड है। यदि आप यूनिकोड पाठ को संग्रहीत करना चाहते हैं तो आप इसका उपयोग करते हैंnvarchar डेटा प्रकार का ।

यदि डेटाबेस पाठ को संग्रहीत करने के लिए UTF-8 का उपयोग करेगा, तो आप अभी भी पाठ को कूटबद्ध UTF-8 डेटा के रूप में नहीं निकाल पाएंगे, आप इसे डिकोड किए गए पाठ के रूप में बाहर निकालेंगे।

आप आसानी से डेटाबेस में UTF-8 एनकोडेड टेक्स्ट को स्टोर कर सकते हैं, लेकिन फिर आप इसे टेक्स्ट के रूप में स्टोर नहीं करते हैं, आप इसे बाइनरी डेटा ( varbinary) के रूप में स्टोर करते हैं ।


इनपुट के लिए धन्यवाद। इसके चारों ओर सीखने के लिए और अधिक है, उदाहरण के लिए stackoverflow.com/questions/3951722/…
Teson

मैं इस के आसपास अपना सिर नहीं मिल सकता। "UTF8 के लिए सेट किया गया वर्ण यूनिकोड है" ?? यूनिकोड की तुलना में utf8 रास्ता व्यापक नहीं है। यूनिकोड UTF8 बनाम में सहेजा जा रहा है Dauðalogn अलग परिणाम देता है: (एफई बी बी बीएफ) 44 61 75 सी 3 B0 61 6C 6F 67 6E बनाम \ u0044 \ u0061 \ u0075 \ u00f0 \ u0061 \ u006c \ u006f \ u0067 \ u006e
Teson

2
@ user247245: UTF-8 एन्कोडिंग है और यूनिकोड वर्ण सेट है। यूटीएफ -8 यूनिकोड को बचाने का एक तरीका है। आपने यूनिकोड का प्रतिनिधित्व करने के लिए जो उपयोग किया है वह स्ट्रिंग शाब्दिकों में उपयोग किए जाने वाले कोड से बचना है, यह आमतौर पर नहीं है कि आप फाइल के रूप में यूनिकोड का प्रतिनिधित्व कैसे करते हैं। UTF-32 एक फ़ाइल प्रारूप में सीधे Uncode से निकटतम अनुवाद होगा, जहां प्रत्येक वर्ण कोड को 32 बिट संख्या के रूप में सहेजा जाता है।
गुफ़ा

क्या आप यह बता सकते हैं कि ऊपर दिए गए उदाहरण में तीसरा अक्षर UTF8 में C3 B0 के रूप में और यूनिकोड में केवल F0 के रूप में क्यों दर्शाया गया है। आपकी सहायता के लिए धन्यवाद।
टेसन

4
@ user247245: 8 और 11 बिट्स के बीच कैरेक्टर कोड 110xxxxx 10xxxxxxUTF-8 (जहां xडेटा बिट्स का प्रतिनिधित्व करता है) के रूप में एन्कोड किए गए हैं , इसलिए वर्ण कोड F0( 0001111000011 बिट्स के रूप में) एन्कोडेड है 11000011 10110000( 00011पहले बाइट में वर्ण कोड से और 110000दूसरे में डाल ) ) जो है C3 B0
गुफ़ा

24

ऐसा लगता है कि अंततः SQL Server 2019 में समर्थन किया जाएगा! SQL सर्वर 2019 - नया क्या है?

BOL से:

UTF-8 का समर्थन

आयात या निर्यात एन्कोडिंग के रूप में व्यापक रूप से उपयोग किए गए UTF-8 वर्ण एन्कोडिंग के लिए पूर्ण समर्थन, या डेटाबेस-स्तर या स्तंभ-स्तरीय पाठ डेटा के रूप में। UTF-8 को CHARऔर VARCHARडेटाैटिप्स में अनुमति दी जाती है , और UTF8प्रत्यय के साथ टकराव के लिए किसी वस्तु के टकराव को बनाते या बदलते समय सक्षम किया जाता है।

उदाहरण के लिए, LATIN1_GENERAL_100_CI_AS_SCको LATIN1_GENERAL_100_CI_AS_SC_UTF8। UTF-8 विंडोज collations कि अनुपूरक वर्णों का समर्थन करते, के रूप में एसक्यूएल सर्वर 2012 में शुरू की गई करने के लिए ही उपलब्ध है NCHARऔर NVARCHARUTF-16 केवल एन्कोडिंग अनुमति देते हैं, और अपरिवर्तित ही रहेंगे।

यह सुविधा उपयोग में निर्धारित चरित्र के आधार पर महत्वपूर्ण भंडारण बचत प्रदान कर सकती है। उदाहरण के लिए, से ASCII तार के साथ मौजूदा स्तंभ डेटा प्रकार को बदलने NCHAR(10)के लिए CHAR(10)एक UTF-8 सक्षम मिलान का उपयोग कर, भंडारण आवश्यकताओं में लगभग 50% की कमी में तब्दील हो। यह कमी है क्योंकि NCHAR(10)भंडारण के लिए 22 बाइट्स की आवश्यकता होती है, जबकि CHAR(10)एक ही यूनिकोड स्ट्रिंग के लिए 12 बाइट्स की आवश्यकता होती है।

2019-05-14 अपडेट:

दस्तावेज़ीकरण अब अपडेट किया जा रहा है और " कोलिशन और यूनिकोड सपोर्ट " खंड में MSSQL 2019 में हमारे विकल्पों को दर्शाता है

2019-07-24 अपडेट:

पेड्रो लोप्स का लेख - वरिष्ठ कार्यक्रम प्रबंधक @ Microsoft ने Azure SQL डेटाबेस के लिए UTF-8 समर्थन शुरू करने के बारे में


4

ध्यान दें कि Microsoft SQL सर्वर 2016 के रूप में, UTF-8 के द्वारा समर्थित है bcp, BULK_INSERTऔर OPENROWSET

परिशिष्ट 2016-12-21: SQL सर्वर 2016 SP1 अब मानक और एक्सप्रेस सहित MS SQL के सभी संस्करणों के लिए यूनिकोड संपीड़न (और सबसे पहले अन्य एंटरप्राइज़-केवल सुविधाएँ) सक्षम करता है। यह UTF-8 समर्थन के समान नहीं है, लेकिन यह एक समान लाभ देता है यदि लक्ष्य पश्चिमी अक्षर के लिए डिस्क स्थान में कमी है।


लेकिन OPENQUERY नहीं? मुझे आश्चर्य है कि अगर यही कारण है कि मैं ओपेंक्स्टरी का उपयोग करते हुए ओरेकल से सीएलओबी डेटा को स्थानांतरित करने के मुद्दे पर हूं।
ज्योफ दाऊद

4

T-SQL में UTF-8 से निपटने के लिए दो UDF:

CREATE Function UcsToUtf8(@src nvarchar(MAX)) returns varchar(MAX) as
begin
    declare @res varchar(MAX)='', @pi char(8)='%[^'+char(0)+'-'+char(127)+']%', @i int, @j int
    select @i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0
    begin
        select @j=unicode(substring(@src,@i,1))
        if @j<0x800     select @res=@res+left(@src,@i-1)+char((@j&1984)/64+192)+char((@j&63)+128)
        else            select @res=@res+left(@src,@i-1)+char((@j&61440)/4096+224)+char((@j&4032)/64+128)+char((@j&63)+128)
        select @src=substring(@src,@i+1,datalength(@src)-1), @i=patindex(@pi,@src collate Latin1_General_BIN)
    end
    select @res=@res+@src
    return @res
end

CREATE Function Utf8ToUcs(@src varchar(MAX)) returns nvarchar(MAX) as
begin
    declare @i int, @res nvarchar(MAX)=@src, @pi varchar(18)
    select @pi='%[à-ï][€-¿][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0 select @res=stuff(@res,@i,3,nchar(((ascii(substring(@src,@i,1))&31)*4096)+((ascii(substring(@src,@i+1,1))&63)*64)+(ascii(substring(@src,@i+2,1))&63))), @src=stuff(@src,@i,3,'.'), @i=patindex(@pi,@src collate Latin1_General_BIN)
    select @pi='%[Â-ß][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0 select @res=stuff(@res,@i,2,nchar(((ascii(substring(@src,@i,1))&31)*64)+(ascii(substring(@src,@i+1,1))&63))), @src=stuff(@src,@i,2,'.'),@i=patindex(@pi,@src collate Latin1_General_BIN)
    return @res
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.