संक्षेप में, क्योंकि इस पर पहले एक हजार बार चर्चा की जा चुकी है:
- PHP में एक स्ट्रिंग होती है, जैसे
"漢字"
, UTF-8 में एन्कोड किया गया। इसके लिए बाइट्स हैंE6 BC A2 E5 AD 97
। - यह इस स्ट्रिंग को डेटाबेस कनेक्शन पर भेजता है जो
latin1
पर सेट है । - डेटाबेस बाइट प्राप्त करता है
E6 BC A2 E5 AD 97
, यह सोचना कि वेlatin1
. का प्रतिनिधित्व करते हैं वर्ण। - डेटाबेस वर्णों को संग्रहीत करता है
æ¼¢å
(वे अक्षर जोE6 BC A2 E5 AD 97
latin1
. में मैप करें )। - उसी प्रक्रिया को उलटने से PHP को वही बाइट प्राप्त होती है, जिसे वह तब UTF-8 के रूप में मानता है। राउंडट्रिप PHP के लिए ठीक काम करता है, भले ही डेटाबेस वर्णों के साथ वैसा व्यवहार न करे जैसा उसे करना चाहिए।
तो यहां समस्या यह थी कि डेटाबेस में डेटा दर्ज करते समय डेटाबेस कनेक्शन गलत तरीके से सेट किया गया था। आपको डेटाबेस में डेटा को सही वर्णों में बदलना होगा। इसे आजमाएं:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
शायद utf8
वह नहीं है जो आपको यहां चाहिए, प्रयोग करें। अगर यह काम करता है, तो इसे UPDATE
में बदलें डेटा को स्थायी रूप से अपडेट करने के लिए स्टेटमेंट।