2015-06-23 7 views
11

हमारे पास एक पुराना 5.1 माइस्क्ल सर्वर सर्वर 2003 पर चल रहा है। हाल ही में हम माइस्क्ल 5.6 और सर्वर 2008 के साथ एक नए वातावरण में स्थानांतरित हो गए हैं। अब नए सर्वर पर 'Ã' जैसे विशेष वर्ण डालने पर हम त्रुटियां प्राप्त करते रहते हैं।गलत स्ट्रिंग मान: ' xC2 x9Fe 10 ...' कॉलम

अब मैंने स्रोत एन्कोडिंग की जांच की है और यह यूटीएफ -8 है। लेकिन पुराने MySQL सर्वर को लैटिन 1 (सर्वर/टेबल/कॉलोनम) के रूप में कॉन्फ़िगरेशन latin_swedish_ci के साथ कॉन्फ़िगर किया गया था और हमें पुराने वातावरण पर कोई त्रुटि नहीं मिली थी।

अब मैंने कुछ परीक्षण किया है क्योंकि हम नए पर्यावरण पर नहीं रहते हैं। मैंने टेबल/कॉलोन के साथ-साथ लैटिन 1 में सभी टेबल सेट करने का प्रयास किया है। दोनों मामलों में मैं इन त्रुटियों को प्राप्त करता रहता हूं।

मैंने जो देखा वह पुराने सर्वर पर सर्वर डिफ़ॉल्ट चार-सेट लैटिन 1 है और नए सर्वर पर इसके utf-8 है। क्या यह समस्या हो सकती है? मुझे यह बहुत अजीब लगता है क्योंकि स्रोत utf-8 है।

क्या ऐसा कुछ विकल्प हो सकता है जो पुराने वातावरण पर चालू हो सकता है? मुझे यकीन नहीं है कि ऐसा कुछ मौजूद है या नहीं। मैंने mysql व्यवस्थापक उपकरण के भीतर सेटिंग्स की तुलना की और डिफ़ॉल्ट चार-सेट के अलावा यह वही दिखता है।

संपादित करें:

शो की तरह 'चार%' चर;

पुराने सर्वर:

+--------------------------+-----------------------------------------------+ 
| Variable_name   | Value           | 
+--------------------------+-----------------------------------------------+ 
| character_set_client  | utf8           | * 
| character_set_connection | utf8           | * 
| character_set_database | latin1          | 
| character_set_filesystem | binary          | 
| character_set_results | utf8           | * 
| character_set_server  | latin1          | 
| character_set_system  | utf8           | 

नई सर्वर:

+--------------------------+-----------------------------------------------+ 
| Variable_name   | Value           | 
+--------------------------+-----------------------------------------------+ 
| character_set_client  | utf8mb4          | * 
| character_set_connection | utf8mb4          | * 
| character_set_database | utf8           | 
| character_set_filesystem | binary          | 
| character_set_results | utf8mb4          | * 
| character_set_server  | utf8           | 
| character_set_system  | utf8           | 

एक की सुपर सेट जहाँ तक मुझे MySQL साइट utf8mb4 पर लेख भर से समझने के रूप में किया जाता है utf8 यह एन्कोडिंग के लिए कोई समस्या नहीं पैदा करना चाहिए, मुझे लगता है कि वे मूल रूप से एन्कोडिंग पर समान हैं?

+0

हां, utf8mb4 utf8 से 'बेहतर' है। फिर भी, एक को पूरे MySQL में सुसंगत होना चाहिए। 'Ã' का संदर्भ क्या है? 'C29Fe' में से? वहां अतिरिक्त संकेत हो सकते हैं। (फिर भी 'Ã' दोनों वर्ण सेटों में मान्य है और सी 2 9 एफ (मुझे लगता है) दोनों में अमान्य है।) –

उत्तर

1

old UTF-8 of MySQL असली यूटीएफ -8 नहीं था। यदि आप "विशेष" वर्ण (जापानी या चीनी) आज़माते हैं तो आप शायद अपने पुराने सर्वर पर वर्गों या प्रश्न चिह्नों के साथ समाप्त हो जाएंगे।

आपका नया सर्वर अब वास्तव में यूटीएफ -8 (एमबी 4 मल्टी-बाइट्स 4 के लिए खड़ा है) का उपयोग कर रहा है। सर्वर को यूटीएफ -8 अक्षरों को प्राप्त होता है, लेकिन जाहिर है, यूटीएफ -8 अक्षरों को स्टोर नहीं कर सकता क्योंकि आपकी तालिका यूटीएफ -8 का उपयोग नहीं कर रही है। सभी तालिकाओं को यूटीएफ -8 और डेटाबेस को यूटीएफ -8 में कनवर्ट करें और आप अपनी समस्या का समाधान करेंगे।

आप के साथ ऐसा कर सकते हैं:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

से पहले बैकअप के लिए मत भूलना।

स्रोत: https://stackoverflow.com/a/6115705/1980659

+0

जहां तक ​​मैं इसे देख सकता हूं यह नए सर्वर पर काम करता है। लेकिन सवाल जो अभी भी अनसुलझा है, यह पुराने सर्वर पर क्यों काम करता है। स्क्रिप्ट में मैं कहता हूं कि स्रोत के समान सेटिंग्स का उपयोग करें। क्योंकि मुझे लगता है कि यह पुराने जैसा ही काम करेगा? या संस्करणों के बीच एन्कोडिंग में उल्लिखित एक अंतर है? –

0

एक अनुभवी मुझे मिला जब मैं अपना आवेदन नए एनवी में ले जा रहा था। तालिका में डालने के लिए डेटा से संबंधित डेटा डालने पर मुझे कुछ अजीब चीज मिली, मेरे मामले में यह शिकायत की गई कि तारीख खाली थी, इसलिए इसे तालिका में नहीं डाला जा सकता (स्रोत कोड पर कोई बदलाव नहीं। केवल नए एनवी (माइस्क्ल सर्वर 5.1 से 5.6 तक , बिल्ला 6 बिल्ला 7, नई Suse सर्वर संस्करण) के लिए।

मैं अपने आवेदन के लिए नए संस्करण को mysql संबंधक चालक को बदलने के लिए कोशिश करते हैं और यह समस्या हल हो गई।

+0

मैंने अभी जांच की है लेकिन हमारे पास मशीन पर नवीनतम mysql कनेक्टर odbc 5.3.4 स्थापित है। –

2
  1. पहले के बाद से पुराने माहौल था सही तरीके से काम करना, पहली पसंद नए वातावरण में एक ही "चरित्र सेट" सेटिंग का उपयोग करना होगा। यदि आपके पास अभी भी 5.0 सर्वर तक पहुंच है, तो SHOW VARIABLES; लें।

5.0 latin1 पर डिफ़ॉल्ट; 5.6 डिफ़ॉल्ट utf8 पर। यह ज्यादातर

mysql> SHOW VARIABLES LIKE 'char%'; 
+--------------------------+-----------------------------------------------+ 
| Variable_name   | Value           | 
+--------------------------+-----------------------------------------------+ 
| character_set_client  | utf8           | * 
| character_set_connection | utf8           | * 
| character_set_database | latin1          | 
| character_set_filesystem | binary          | 
| character_set_results | utf8           | * 
| character_set_server  | latin1          | 
| character_set_system  | utf8           | 

SET NAMES utf8; में दिख रहा है तीन चिह्नित किये लाइनों सेट करता है।

à लैटिन 1 में हेक्स C3 और C383 utf8 में है।More encodings here

SELECT col, HEX(col) FROM table WHERE ... 
  1. एक और संभावना है कि "इस कदम" डेटा घायल है: क्या किसी तालिका में वर्तमान में है देखने के लिए इस करो। यदि आप दोनों मशीनों पर एक ही SELECT कर सकते हैं, और यदि वे अलग-अलग आते हैं, तो माइग्रेशन खराब था। चूंकि डेटा स्थानांतरित करने के कई तरीके हैं, कृपया माइग्रेशन का विवरण प्रदान करें ताकि हम गलत तरीके से क्या हो सकता है विच्छेदन कर सकें।

  2. आपके शीर्षक में, आपके पास C29F है। यह एक अजीब बात है - यह एक नियंत्रण कोड APPLICATION PROGRAM COMMAND है, जिसे मैंने कभी नहीं सुना है। (नोट: यह बाद में उल्लिखित Ã से संबंधित नहीं है।) कृपया समस्याओं के अधिक उदाहरण प्रदान करें; उन सुरागों में से कोई भी सहायक नहीं है।

+0

मेरा संपादन देखें। मैंने सर्वर से दोनों आउटपुट जोड़े हैं। मेरे पास एक नया डेटाबेस है और आपके लिए कुछ और परिणाम/मामले प्राप्त करने के लिए कुछ परीक्षण डेटा डालेगा। –

1

इस का महत्वपूर्ण हिस्सा है कि अपने पुराने सर्वर था:

| character_set_database | latin1 

यह कोई फर्क नहीं पड़ता है, जबकि अपने नए सर्वर

| character_set_database | utf8 

है कि कनेक्शन और यदि डेटाबेस लैटिन 1 का उपयोग कर रहा है, तो क्लाइंट utf8 का उपयोग कर रहे हैं, तालिका लैटिन 1 के लिए डिफ़ॉल्ट होगी और इसलिए डेटा लैटिन 1 में संग्रहीत किया जाएगा और आपको अपनी त्रुटि मिल जाएगी। आप निश्चित रूप से डेटाबेस डिफ़ॉल्ट के अलावा किसी भी तालिका के लिए वर्ण सेट और संयोजन को स्पष्ट रूप से सेट कर सकते हैं।

मुझे लगता है कि जब आप डेटाबेस स्कीमा माइग्रेट करते हैं तो आपने डेटाबेस के लिए वर्ण एन्कोडिंग संपादित नहीं किया है, या माइग्रेशन स्क्रिप्ट चलाने से पहले टेबल संपादित नहीं किया है।

अब आप या तो डेटाबेस और प्रत्येक तालिका मैन्युअल रूप से बदल सकते हैं, या आप माइग्रेशन स्क्रिप्ट को संपादित कर सकते हैं और इसे फिर से चालू कर सकते हैं। अधिकांश माइग्रेशन स्क्रिप्ट और डेटाबेस डंप में प्रत्येक तालिका के साथ-साथ डेटाबेस के लिए विशिष्ट वर्ण सेट शामिल होगा, भले ही वे सभी समान हों।

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