पायथन में पुनर्प्राप्त SQL सर्वर VARCHAR स्तंभ के साथ एन्कोडिंग समस्या


10

हमारे पास हाल ही में एक क्षेत्र से संबंधित एन्कोडिंग के साथ एक समस्या थी जिसे SQL सर्वर में एक varchar (120) के रूप में संग्रहीत किया जा रहा है। SSMS में, varchar दिखाई देता है:

"किसने जॉनबेन को मार डाला?"

हालाँकि, जब इसे अजगर में लाया जाता है, यह इस प्रकार दिखाई देता है:

यहाँ छवि विवरण दर्ज करें

मैंने पायथन पक्ष से इस पर शोध किया है, और कुछ भी अजीब नहीं चल रहा है। मेरा सिद्धांत है कि SQL सर्वर में varchar UTF-8 वर्णों को स्वीकार कर रहा है जो कि SSMS की तुलना में अजगर में अलग तरह से प्रदर्शित हो रहे हैं। मैं SQL सर्वर में एन्कोडिंग से बहुत परिचित नहीं हूँ। क्या कोई मुझे निम्नलिखित बता सकता है:

  • क्या SSMS में varchar की एन्कोडिंग देखने का कोई तरीका है? उदाहरण के लिए, SSMS से वर्तमान में कॉमा प्रदर्शित करने के बजाय \ x82 देखें?
  • हम SQL Server 2008 का उपयोग कर रहे हैं। क्या किसी भी UTF-8 वर्णों के लिए एन्कोडिंग को ASCII वर्णों में आयात / निर्यात टूल का उपयोग किए बिना या एक फ्लैट फ़ाइल में डंपिंग के बिना एन्कोडिंग को बदलने का कोई तरीका है? यानी मैं एक क्वेरी के माध्यम से यह रूपांतरण कर सकता हूं?
  • क्या किसी प्रश्न के माध्यम से समस्याग्रस्त रिकॉर्ड को प्रोग्रामेटिक रूप से पहचानने का कोई तरीका है (समस्याग्रस्त को UTF-8 वर्णों के रूप में परिभाषित किया जा रहा है जो ASCII के माध्यम से समर्थित नहीं हैं)?

आपका अग्रिम में ही बहुत धन्यवाद!

उपयोग करके sp_help N'table_name';मैंने पाया कि इस VARCHARकॉलम का Collation है SQL_Latin1_General_CP1_CI_AS:।


वह VARCHARकॉलम किस कॉलम का उपयोग कर रहा है?
सोलोमन रटज़की

@SolomonRutzky आप टकराव की जांच कैसे करते हैं। मुझे यकीन नहीं है कि इसका क्या मतलब है
एरिक

तेज तरीका मुझे लगता है कि यह है: sp_help N'table_name';। "नाम" के आधार पर कॉलम देखें और फिर "collation_name" कॉलम देखें।
सोलोमन रटज़की

@SolomonRutzky उस फ़ील्ड के लिए कोलाज 'SQL_Latin1_General_CP1_CI_AS'
Eric

जवाबों:


17

SQL सर्वर किसी भी परिस्थिति में UTF-8 को संग्रहीत नहीं करता है। आप या तो UTF-16 लिटिल एंडियन (LE) के माध्यम से प्राप्त करते हैं NVARCHAR(सहित NCHARऔर NTEXT, लेकिन कभी उपयोग न करें NTEXT) और XML, या कुछ 8-बिट एन्कोडिंग, कोड पृष्ठ के आधार पर, VARCHAR(सहित CHARऔर TEXT, लेकिन कभी उपयोग न करें TEXT) ।

यहां समस्या यह है कि आपका कोड उस 0x82 वर्ण को गलत समझ रहा है, यह सोचकर कि यह UTF-8 है, लेकिन यह नहीं है। कोई UTF-8 "वर्ण" नहीं है, जिसका मान 0x82 है, यही कारण है कि आपको "" "का" अज्ञात "/ प्रतिस्थापन प्रतीक मिलता है। कृपया निम्न UTF-8 तालिका देखें, जिससे पता चलता है कि 0x82 के एकल-बाइट के लिए कोई वर्ण नहीं है:

UTF-8 एन्कोडिंग टेबल

जैसा कि ओपी द्वारा कहा गया है SQL_Latin1_General_CP1_CI_AS, प्रश्न में कॉलम का कोलाजेशन है , जिसका अर्थ है कि 8-बिट एन्कोडिंग कोड पृष्ठ 1252 का उपयोग कर रही है, जो कि विंडोज लैटिन 1 (एएनएसआई) है । और उस चार्ट (नीचे के चार्ट पर स्क्रॉल करें क्योंकि उसमें चरित्र के नाम हैं) मान 0x82 ("कोड प्वाइंट" कॉलम में "82" के लिए देखें) वास्तव में सिंगल लो -9 कोटेशन मार्क है जिसे आप एसएसएमएस में देखते हैं। यह चरित्र, UTF-8 में, एक 3 बाइट अनुक्रम है E2 80 9A:।

क्या इसका मतलब यह है की सभी: कोड पृष्ठ 1252 के लिए SQL सर्वर कनेक्शन के लिए क्लाइंट-एन्कोडिंग या तो सेट करने के लिए अपने अजगर कोड की जरूरत है, या आप / परिवर्तन करने की जरूरत है लौटे स्ट्रिंग की एन्कोडिंग परिवर्तित से कोड पृष्ठ 1252 के लिए UTF-8।

बेशक, यदि यह एक वेब पेज पर प्रदर्शित किया जा रहा है, तो आप पृष्ठ के घोषित चारसेट को बदल सकते हैं Windows-1252, लेकिन हो सकता है कि पृष्ठ पर अन्य वर्णों के साथ हस्तक्षेप हो अगर वहां पहले से ही UTF-8 अक्षर हैं।


अच्छा, यह बहुत उपयोगी है, धन्यवाद सुलैमान। कृपया मुझे मालकिन के बारे में बताएं। यह एक बहुत ही मुश्किल मुद्दा है और मुझे यह भी पता नहीं है कि इसे कहाँ से शुरू करना है।
एरिक

वाह, अद्भुत विस्तार, @ सॉलोमन! मैं यहां एक अलग अजगर + एमएस SQL ​​समस्या की तलाश में उतरा, लेकिन पढ़ता रहा क्योंकि मैं बहुत कुछ सीख रहा था। :-P
माइक विलियमसन

1
@ मायकेविलियम्सन कि तारीफ साझा करने के लिए धन्यवाद :)। आपको निम्नलिखित में भी दिलचस्पी हो सकती है: TSQL md5 हैश C # .NET md5 (SO पर), हाउ टू स्ट्रिप हिब्रू एक्सेंट एक्सेंट (DBA.SE पर) और Collations.Info में भिन्न है । का आनंद लें!
सोलोमन रटज़की

धन्यवाद! मुझे संदेह है कि गैर-लैटिन-आधारित भाषा के साथ काम करने वाले किसी भी व्यक्ति को यह सामान अमेरिका / यूके में आनंदित काम करने की तुलना में कहीं बेहतर है। :)
माइक विलियमसन

1
बस एक नोट: MS SQL Server 2019, VARCHAR / CHAR डेटाटिप्स में UTF-8 के लिए मूल समर्थन का परिचय देता है।
ग्रेगरी एरेनीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.