क्या SQL सर्वर कॉलम/फ़ील्ड को UTF-8 एन्कोडिंग के रूप में परिभाषित करने का कोई तरीका है?
नहीं, SQL सर्वर में केवल यूनिकोड एन्कोडिंग UTF-16 लिटिल एंडियन है, जो कि NCHAR
है। , NVARCHAR
, NTEXT
(एसक्यूएल सर्वर 2005 के रूप में बहिष्कृत इसलिए इसे नए विकास में उपयोग न करें; इसके अलावा, यह NVARCHAR(MAX)
की तुलना में बेकार है। वैसे भी), और XML
डेटाटाइप्स को संभाला जाता है। आपको कुछ अन्य RDBMS की अनुमति की तरह यूनिकोड एन्कोडिंग का विकल्प नहीं मिलता है।
आप SQL सर्वर में UTF-8 एन्कोडेड XML सम्मिलित कर सकते हैं, बशर्ते आप इन तीन नियमों का पालन करें:
- आने वाली स्ट्रिंग डेटा प्रकार की होनी चाहिए
VARCHAR
, नहींNVARCHAR
(NVARCHAR
. के रूप में हमेशा यूटीएफ -16 लिटिल एंडियन होता है, इसलिए एन्कोडिंग को स्विच करने में सक्षम नहीं होने के बारे में त्रुटि)। - XML में एक XML घोषणा है जो स्पष्ट रूप से बताती है कि XML की एन्कोडिंग वास्तव में UTF-8 है:
<?xml version="1.0" encoding="UTF-8" ?>
। - बाइट अनुक्रम को वास्तविक 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)
के रूप में संग्रहीत करने के अलावा कोई विकल्प नहीं है। ।