Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

गलत एन्कोडिंग में डालने के बाद MySQL डेटाबेस में डेटा अपडेट कर रहा है

आप "डबल एन्कोडिंग" से पीड़ित हैं।

यहाँ क्या हुआ।

  • क्लाइंट के पास utf8 के रूप में एन्कोड किए गए वर्ण थे; और
  • SET NAMES latin1 क्लाइंट के पास latin1 एन्कोडिंग होने का दावा करके झूठ बोला गया; और
  • तालिका में कॉलम घोषित CHARACTER SET utf8

आइए देखें कि ई-एक्यूट का क्या होता है:é

  1. उसके लिए हेक्स, utf8 में 2 बाइट्स है:C3A9
  2. SET NAMES latin1 इसे 2 latin1-एन्कोडेड वर्णों . के रूप में देखा Ã और © (हेक्स:C3 और A9 )
  3. चूंकि लक्ष्य था CHARACTER SET utf8 , उन 2 वर्णों को परिवर्तित करने की आवश्यकता है।Ã utf8 में बदल दिया गया था (हेक्स C383 ) और © (हेक्स C2A9 )
  4. इसलिए, 4 बाइट्स संग्रहीत किए गए (हेक्स C383C2A9 )

इसे वापस पढ़ते समय, उल्टे कदम उठाए गए, और अंतिम उपयोगकर्ता ने संभवतः कुछ भी गलत नहीं देखा। क्या गलत है:

  • संग्रहीत डेटा जितना होना चाहिए उससे 2 गुना बड़ा है (एशियाई भाषाओं के लिए 3x)।
  • बराबर, इससे अधिक, आदि के लिए तुलना अपेक्षा के अनुरूप काम नहीं कर सकती है।
  • ORDER BY उम्मीद के मुताबिक काम नहीं कर सकता।

कुछ इस तरह आपके डेटा की मरम्मत करेगा:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin1)) USING utf8);

अधिक चर्चा औरइसे ठीक करने के और उदाहरण




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql sproc में तालिका नाम के लिए एक चर का उपयोग करें

  2. MySQL डेमॉन सर्वर शुरू नहीं कर सकता:टीसीपी/आईपी पोर्ट पर बाइंड:पता पहले से उपयोग में है (यह नहीं है)।

  3. MySQL में तिथियों की तुलना करें

  4. हेरोोकू में एक रेल 3.1 ऐप के लिए एकाधिक डेटाबेस का उपयोग कैसे करें?

  5. MySQL:दो परिणाम सेट का अंतर