आप "डबल एन्कोडिंग" से पीड़ित हैं।
यहाँ क्या हुआ।
- क्लाइंट के पास 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);
अधिक चर्चा औरइसे ठीक करने के और उदाहरण