समस्या का आधार:
पुण इरादा।इकाई फ्रेमवर्क और MySQL के साथ पढ़ने के दौरान VARCHAR को बिनरी के रूप में एक्सेस करना?
समस्या एक बहुत पुरानी dBase डेटाबेस जहां शाब्दिक जानकारी DOS Cyrillic (CP-866) में सीधे इनकोडिंग के साथ शुरू होता है, और क्योंकि यह है कि एक समस्या के लिए पर्याप्त नहीं है, यह भी हर शाम एक MySQL डेटाबेस के लिए स्थानांतरित किया जा रहा है, जो करने के लिए मैं उपयोग कर सकते है।
मैंने MySQL प्रदाता स्थापित किए हैं और एंटीटी फ्रेमवर्क के साथ डेटाबेस से कनेक्ट किया है, जो मेरा मुख्य डेटा एक्सेस विधि था, और फिर शुद्ध एडीओ.NET के साथ प्रयोगात्मक कारणों के लिए भी।
सब कुछ बेहतर की उम्मीद की तुलना में जा रहा था जब तक मैं UTF-8, जैसे इतना करने के लिए डेटाबेस से माना जाता है कि CP-866 मान परिवर्तित करने का प्रयास:
var cp866 = Encoding.GetEncoding(866);
var utf8 = Encoding.UTF8;
string source = "some unreadable set of characters from the database";
byte[] cp866bytes = cp866.GetBytes(source);
byte[] utf8bytes = Encoding.Convert(cp866, utf8, cp866bytes);
string result = utf8.GetString(utf8bytes);
मैं इसे एक बार के साथ पढ़ा है EntityFramework और एक ही परिणाम के साथ ADO.NET के साथ।
अज्ञात के लिए समय और कम-अज्ञात अब कारणों, यह काम नहीं किया पर। एन्कोडिंग और स्ट्रिंग मानों के बारे में कुछ महत्वपूर्ण लेख पढ़ने के बाद मैंने यह निर्धारित किया है कि स्ट्रिंग वेरिएबल की प्रकृति के कारण डेटाबेस में वर्चर फ़ील्ड के बराबर स्ट्रिंग पर ऐसे रूपांतरण लागू करना संभव नहीं है।
कुछ कुंजीपटल बैंग्स बाद में, मैं अंत में स्तंभ मैं के साथ परीक्षण किया गया था करने के लिए CONVERT (varcharColumn, बाइनरी) जोड़कर ADO.NET MySQL प्रदाता का उपयोग करने और अपनी क्वेरी को अनुकूलित करके ऐसा कर दिया है।
तब से, मैंने उपर्युक्त कोड का उपयोग केवल अंतर के साथ किया था जिसमें मेरे पास कनवर्ट से cp866 बाइट सरणी थी। मैं मूल रूप से कुछ ऐसा करने का इरादा रखता हूं लेकिन MySQL प्रदाता सीधे वर्चर्स फ़ील्ड से बाइट्स को पढ़ने में सक्षम नहीं था, न ही मुझे एंटिटी फ्रेमवर्क के साथ ऐसा करने का कोई तरीका मिला।
हां, यह काम करता है, लेकिन यह मेरे अनुभवहीन स्वयं तक भी सही नहीं लगता है।
सवाल:
1: मैं कैसे इकाई की रूपरेखा विशिष्ट क्षेत्रों का चयन करना चाहिए निर्दिष्ट कर सकते हैं?
मैं किसी भी तरह से अपने प्यारे ओआरएम को समझाऊंगा कि इसे पढ़ने के दौरान विशिष्ट वर्चर्स फ़ील्ड को बाइनरी में परिवर्तित करना चाहिए, स्ट्रिंग प्रस्तुति को वापस किए बिना, क्योंकि यह सब कुछ गड़बड़ कर देता है।
2: क्या एडीओ.NET MySQL प्रदाता को वर्चर फ़ील्ड के बाइट प्राप्त करने का कोई तरीका है, इसे पहले स्ट्रिंग के रूप में खींचने के बिना?
वेटर के साथ उपयोग किए जाने पर GetBytes विधि अपवाद फेंकता है, और GetSqlBytes विधि जो आमतौर पर ADO.NET प्रदाता में मौजूद होती है, MySQL संस्करण में अनुपलब्ध है। मैं वास्तव में हर क्षेत्र पर बाइनरी कन्वर्ट लिखना नहीं चाहता हूं जिसे मुझे ठीक से पढ़ने की जरूरत है।
3: बोनस प्रश्न: क्या सीपी -866 एन्कोडेड वर्कर फ़ील्ड को एक स्ट्रिंग के रूप में पढ़ना संभव है, लेकिन इस बार यूटीएफ -8 में एन्कोडिंग को सही ढंग से बदलना संभव है?
आज के पढ़ने के बाद एन्कोडिंग विषय पर अभी भी मेरे सिर में बहुत सारे अराजकताएं हैं। मैं अभी भी विश्वास वहाँ कुछ मुझे याद आ रही हो सकता है और यह कि, CP-866 इनकोडिंग varchar क्षेत्रों से एक स्ट्रिंग को पढ़ने के लिए संभव है की तरह:
string cp866EncodedValue = "Œ€„‹… Œ‹€„…Ž‚€ Šš…‚€"; //actual copy-pasted value
..और फिर यह UTF-8 में बदलने का है, जबकि में होने दिमाग में डेटाबेस को सीपी -866 के साथ एन्कोड किया गया था। जो मैंने पढ़ा है, जैसे ही यह एक स्ट्रिंग में है, यह यूनिकोड है और स्ट्रिंग अपरिवर्तनीय है। मैंने इसे बाई सरणी प्रस्तुति प्राप्त करने का प्रयास किया है, इसे cp866 में बदल रहा है, फिर utf8 पर, मैंने इसका उपयोग करने की कोशिश की क्योंकि यह cp866 स्वयं है, लेकिन सफलता के बिना।
MySQL [समर्थन] (http://dev.mysql.com/doc/en/charset-charsets.html) सीपी -866 मूल रूप से; यदि सही तरीके से सेट किया गया है, तो यह आपके लिए यूटीएफ -8 में परिवर्तित हो सकता है (डेटा प्रविष्टि या पुनर्प्राप्ति पर, जैसा आप चाहें)। संभावना है कि जिस कनेक्शन पर आपने मूल रूप से डेटा डाला था, उस चरित्र का सेट सेट गलत था, जिसने तालिका में खराब डेटा का भंडारण किया है: आप इसे मैन्युअल रूप से मैन्युअल रूप से सत्यापित कर सकते हैं। 'Mytable से हेक्स (mycolumn) चुनें। – eggyal
क्या यह सर्वर से सेटिंग है या यह कनेक्शन स्ट्रिंग के माध्यम से सेटअप किया जा रहा है? मैंने सफलता के बिना कनेक्शन स्ट्रिंग पर वर्णसेट विकल्प सेट करने का प्रयास किया। मैंने डेटा सम्मिलन से निपट नहीं लिया है, यह एक और टीम है जो किसी अन्य कंपनी में कुछ डीबेस डेटाबेस से आयात कर रही थी। – Peter
चालक सर्वर से कनेक्शन पर वांछित चरित्र सेट का अनुरोध करेगा; यह * डीएसएन में वांछित चरित्र सेट के ड्राइवर को सूचित करना संभव हो सकता है, लेकिन एक उपयुक्त कमांड का उपयोग करके कनेक्ट करने के बाद * हमेशा * कॉन्फ़िगरेशन बदल सकता है। 'सेट नाम'। अधिक जानकारी के लिए [कनेक्शन कैरेक्टर सेट्स एंड कोलेशन] देखें (http://dev.mysql.com/doc/en/charset-connection.html)। – eggyal