आप "डबल एन्कोडिंग" से पीड़ित हैं।
यहाँ क्या हुआ।
- क्लाइंट के पास utf8 के रूप में एन्कोड किए गए वर्ण थे; और
SET NAMES latin1क्लाइंट के पास latin1 एन्कोडिंग होने का दावा करके झूठ बोला गया; और- तालिका में कॉलम घोषित
CHARACTER SET utf8।
आइए देखें कि ई-एक्यूट का क्या होता है:é ।
- उसके लिए हेक्स, utf8 में 2 बाइट्स है:
C3A9। SET NAMES latin1इसे 2 latin1-एन्कोडेड वर्णों . के रूप में देखाÃऔर©(हेक्स:C3औरA9)- चूंकि लक्ष्य था
CHARACTER SET utf8, उन 2 वर्णों को परिवर्तित करने की आवश्यकता है।Ãutf8 में बदल दिया गया था (हेक्सC383) और©(हेक्सC2A9) - इसलिए, 4 बाइट्स संग्रहीत किए गए (हेक्स
C383C2A9)
इसे वापस पढ़ते समय, उल्टे कदम उठाए गए, और अंतिम उपयोगकर्ता ने संभवतः कुछ भी गलत नहीं देखा। क्या गलत है:
- संग्रहीत डेटा जितना होना चाहिए उससे 2 गुना बड़ा है (एशियाई भाषाओं के लिए 3x)।
- बराबर, इससे अधिक, आदि के लिए तुलना अपेक्षा के अनुरूप काम नहीं कर सकती है।
ORDER BYउम्मीद के मुताबिक काम नहीं कर सकता।
कुछ इस तरह आपके डेटा की मरम्मत करेगा:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
अधिक चर्चा औरइसे ठीक करने के और उदाहरण