2013-06-03 2 views
7

समस्या का आधार:

पुण इरादा।इकाई फ्रेमवर्क और 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 स्वयं है, लेकिन सफलता के बिना।

+0

MySQL [समर्थन] (http://dev.mysql.com/doc/en/charset-charsets.html) सीपी -866 मूल रूप से; यदि सही तरीके से सेट किया गया है, तो यह आपके लिए यूटीएफ -8 में परिवर्तित हो सकता है (डेटा प्रविष्टि या पुनर्प्राप्ति पर, जैसा आप चाहें)। संभावना है कि जिस कनेक्शन पर आपने मूल रूप से डेटा डाला था, उस चरित्र का सेट सेट गलत था, जिसने तालिका में खराब डेटा का भंडारण किया है: आप इसे मैन्युअल रूप से मैन्युअल रूप से सत्यापित कर सकते हैं। 'Mytable से हेक्स (mycolumn) चुनें। – eggyal

+0

क्या यह सर्वर से सेटिंग है या यह कनेक्शन स्ट्रिंग के माध्यम से सेटअप किया जा रहा है? मैंने सफलता के बिना कनेक्शन स्ट्रिंग पर वर्णसेट विकल्प सेट करने का प्रयास किया। मैंने डेटा सम्मिलन से निपट नहीं लिया है, यह एक और टीम है जो किसी अन्य कंपनी में कुछ डीबेस डेटाबेस से आयात कर रही थी। – Peter

+2

चालक सर्वर से कनेक्शन पर वांछित चरित्र सेट का अनुरोध करेगा; यह * डीएसएन में वांछित चरित्र सेट के ड्राइवर को सूचित करना संभव हो सकता है, लेकिन एक उपयुक्त कमांड का उपयोग करके कनेक्ट करने के बाद * हमेशा * कॉन्फ़िगरेशन बदल सकता है। 'सेट नाम'। अधिक जानकारी के लिए [कनेक्शन कैरेक्टर सेट्स एंड कोलेशन] देखें (http://dev.mysql.com/doc/en/charset-connection.html)। – eggyal

उत्तर

1

सबसे पहले मैं आपके डेटाबेस और/या प्रश्न में आपकी तालिका के लिए वर्तमान एन्कोडिंग की जांच करूंगा।

लिंक, जहां कुछ वेरिएबल की स्थापना के लिए इन आदेशों हैं @eggyal अंक: डिफ़ॉल्ट के लिए फिर

SHOW VARIABLES LIKE 'character_set_client'; 
SHOW VARIABLES LIKE 'character_set_results'; 
SHOW VARIABLES LIKE 'character_set_connection'; 

:

SET character_set_client = charset_name; 
SET character_set_results = charset_name; 
SET character_set_connection = charset_name; 

इन जाँच करने के लिए, निम्नलिखित का इस्तेमाल करें डेटाबेस का चरित्र एन्कोडिंग, उपयोग करें:

SHOW CREATE DATABASE databaseName; 

तो है कि विशिष्ट तालिका के लिए, कृपया जांच करें:

show create table TABLE_IN_QUESTION; 

इन तुम्हें पता है के बाद, जो अपने डेटाबेस और/या गिनती में तालिका का सही एन्कोडिंग कर रहे हैं।


मेरे पाया मुद्दों ठीक करने के लिए समाधान एक दिलचस्प स्रोत के लिए सिर्फ एक कड़ी है।

http://nicj.net/mysql-converting-an-incorrect-latin1-column-to-utf8/


पुनश्च: कृपया, एक नज़र इस पोस्ट के बारे में बताने के लिए प्रासंगिक कुछ है, तो है। हां, मैं यूआरएल पढ़ सकता हूं, यह कनवर्टन लैटिन 1 -> utf8 कहता है, लेकिन मेरी समझ के लिए एक ही सुझाव चरित्र एन्कोडिंग के अन्य जोड़े पर भी लागू होगा।

+0

** पीपीएस। * हां **, मैंने यह भी पाया कि आपके पास कुछ विशिष्ट, क्रमांकित प्रश्न हैं और आप कैनोलिक उत्तर (उनसे) पूछते हैं। मुझे यह दिमाग में था, और तैयार दिशाओं के लिए चिपकने के बजाय पीछे की असली समस्या का जवाब देने की कोशिश की। शायद यह केवल एक अच्छा दृष्टिकोण है। मुझे उम्मीद है। * – mico

+0

समस्या यह है कि मेरे पास डेटाबेस की कॉन्फ़िगरेशन तक पहुंच नहीं है। इसे रोजाना मिटा दिया जा रहा है और डीबेस एक से बनाया गया है। मुझे इन लोगों के लिए समस्या को आगे बढ़ाना होगा और मुझे यकीन नहीं है कि वे मदद करने के इच्छुक हैं। – Peter

+0

ठीक है, अगर आपके पास डेटाबेस में कंसोल पहुंच है, तो "मेरा सबसे पहले" - मेरे उत्तर का एक हिस्सा अभी भी लागू होता है। या तुम्हारे पास ऐसा भी नहीं है? – mico

संबंधित मुद्दे

 संबंधित मुद्दे