Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर - UTF-8 एन्कोडिंग के साथ XML प्रकार के कॉलम को परिभाषित करना

<ब्लॉकक्वॉट>

क्या SQL सर्वर कॉलम/फ़ील्ड को UTF-8 एन्कोडिंग के रूप में परिभाषित करने का कोई तरीका है?

नहीं, SQL सर्वर में केवल यूनिकोड एन्कोडिंग UTF-16 लिटिल एंडियन है, जो कि NCHAR है। , NVARCHAR , NTEXT (एसक्यूएल सर्वर 2005 के रूप में बहिष्कृत इसलिए इसे नए विकास में उपयोग न करें; इसके अलावा, यह NVARCHAR(MAX) की तुलना में बेकार है। वैसे भी), और XML डेटाटाइप्स को संभाला जाता है। आपको कुछ अन्य RDBMS की अनुमति की तरह यूनिकोड एन्कोडिंग का विकल्प नहीं मिलता है।

आप SQL सर्वर में UTF-8 एन्कोडेड XML सम्मिलित कर सकते हैं, बशर्ते आप इन तीन नियमों का पालन करें:

  1. आने वाली स्ट्रिंग डेटा प्रकार की होनी चाहिए VARCHAR , नहीं NVARCHAR (NVARCHAR . के रूप में हमेशा यूटीएफ -16 लिटिल एंडियन होता है, इसलिए एन्कोडिंग को स्विच करने में सक्षम नहीं होने के बारे में त्रुटि)।
  2. XML में एक XML घोषणा है जो स्पष्ट रूप से बताती है कि XML की एन्कोडिंग वास्तव में UTF-8 है:<?xml version="1.0" encoding="UTF-8" ?>
  3. बाइट अनुक्रम को वास्तविक UTF-8 बाइट्स होना चाहिए।

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

SET NOCOUNT ON;
DECLARE @XML XML = '<?xml version="1.0" encoding="utf-8"?><root><test>'
                    + CHAR(0xF0) + CHAR(0x9F) + CHAR(0x98) + CHAR(0xB1)
                    + '</test></root>';

SELECT @XML;
PRINT CONVERT(NVARCHAR(MAX), @XML);

रिटर्न ("परिणाम" और "संदेश" दोनों टैब में):

<root><test>😱</test></root>

आपने @Shnugo के उत्तर पर एक टिप्पणी में उल्लेख किया है:

<ब्लॉकक्वॉट>

मुझे SQL सर्वर 2013 NVARCHAR कॉलम में utf-8 हेडर के साथ utf-8 एन्कोडेड स्ट्रीम डालने में कोई समस्या नहीं है। क्या कोई छिपी हुई समस्या होगी?

नहीं, आपने UTF-8 एन्कोडेड किसी भी चीज़ को NVARCHAR . में संग्रहीत नहीं किया है कॉलम (इसके अलावा, SQL सर्वर का कोई 2013 संस्करण नहीं है, लेकिन यह शायद सिर्फ एक टाइपो है)। NVARCHAR केवल यूटीएफ -16 लिटिल एंडियन है। सबसे अधिक संभावना है कि आपकी UTF-8 स्ट्रीम SQL सर्वर में ट्रांज़िट के दौरान डेटाबेस ड्राइवर द्वारा UTF-16 LE में परिवर्तित हो गई। यह वही एन्कोडिंग है जो एक एक्सएमएल कॉलम उपयोग करेगा, लेकिन एक्सएमएल कॉलम ने यूटीएफ -8 से यूटीएफ -16 में स्ट्रीम को बदलने की कोशिश की होगी लेकिन पहले से ही यूटीएफ -16 होने के कारण असफल रहा। इसका अर्थ यह भी है कि SQL सर्वर से बाहर निकलने पर, XML दस्तावेज़ NVARCHAR . में संग्रहीत है कॉलम में अभी भी एक्सएमएल घोषणा होगी कि एन्कोडिंग यूटीएफ -8 है, लेकिन यह निश्चित रूप से यूटीएफ -8 नहीं है।

यदि आपको रास्ते में UTF-8 होने के लिए डेटा की बिल्कुल आवश्यकता है क्योंकि आप SQL सर्वर XML से निकलने वाले UTF-16 LE को कनवर्ट नहीं करना चाहते हैं या NVARCHAR UTF-8 में, तो आपके पास डेटा को VARBINARY(MAX) के रूप में संग्रहीत करने के अलावा कोई विकल्प नहीं है। ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में एक प्रारूप स्ट्रिंग क्या है?

  2. SQL सर्वर का उपयोग कैसे करें ऑलवेजऑन फीचर्स

  3. एसक्यूएल सर्वर (टी-एसक्यूएल) में मुद्रा के रूप में संख्याओं को कैसे प्रारूपित करें

  4. एक बड़ी SQL स्क्रिप्ट निष्पादित करें (GO कमांड के साथ)

  5. SQL सर्वर में डेटाबेस से सभी ट्रिगर कैसे छोड़ें या हटाएं?