आपकी समस्या यह है कि आपका SET NAMES 'utf8_persian_ci'
. है आदेश अमान्य था (utf8_persion_ci एक संयोजन है , नहीं एक एन्कोडिंग ) यदि आप इसे टर्मिनल में चलाते हैं तो आपको एक त्रुटि दिखाई देगी Unknown character set: 'utf8_persian_ci'
. इस प्रकार आपका आवेदन, जब यह संग्रहीत डेटा, latin1
. का उपयोग कर रहा था अक्षरों का समूह। MySQL ने आपके इनपुट को लैटिन 1 वर्णों के रूप में व्याख्यायित किया, जिसे बाद में इसे utf-8 के रूप में एन्कोड किया गया। इसी तरह जब डेटा को वापस बाहर निकाला गया, तो MySQL ने इसे UTF-8 से वापस latin1 में बदल दिया और (उम्मीद है, ज्यादातर समय) मूल बाइट्स जो आपने इसे दिया था।
दूसरे शब्दों में, डेटाबेस में आपका सारा डेटा पूरी तरह से गड़बड़ हो गया है, लेकिन यह काम करने के लिए ऐसा ही हुआ।
इसे ठीक करने के लिए, आपने जो किया उसे पूर्ववत करने की आवश्यकता है। PHP का उपयोग करने का सबसे सीधा तरीका है:
SET NAMES latin1;
- हर टेबल से हर एक टेक्स्ट फील्ड को चुनें।
SET NAMES utf8;
- एक ही स्ट्रिंग का उपयोग करके समान पंक्तियों को बिना किसी परिवर्तन के अपडेट करें।
वैकल्पिक रूप से आप इन चरणों को MySQL के अंदर कर सकते हैं, लेकिन यह मुश्किल है क्योंकि MySQL डेटा को एक निश्चित वर्ण सेट में समझता है। आपको अपने टेक्स्ट कॉलम को बीएलओबी प्रकार में संशोधित करना होगा, फिर उन्हें वापस संशोधित करना होगा utf8 कैरेक्टर सेट के साथ टेक्स्ट टाइप करने के लिए। ALTER TABLE
लाल रंग में "चेतावनी" लेबल वाला MySQL दस्तावेज़
।
इन चीजों में से किसी एक को करने के बाद, आपके डेटाबेस कॉलम में संग्रहीत बाइट वास्तविक वर्ण सेट होंगे जो वे होने का दावा करते हैं। फिर, सुनिश्चित करें कि आप हमेशा mysql_set_charset('utf8')
PHP से किसी भी डेटाबेस एक्सेस पर जो आप भविष्य में कर सकते हैं! नहीं तो आप फिर से चीजों को गड़बड़ कर देंगे। (ध्यान दें, एक साधारण mysql_query('SET NAMES utf8')
का उपयोग न करें ! कोने के मामले हैं (जैसे एक रीसेट कनेक्शन) जहां इसे latin1
. पर रीसेट किया जा सकता है आपकी जानकारी के बिना। mysql_set_charset()
जब भी आवश्यक होगा वर्णसेट सेट कर देगा।)
यह सबसे अच्छा होगा यदि आप mysql_*
. से दूर चले गए हैं फ़ंक्शन और प्रयुक्त PDO
इसके बजाय charset=utf8
. के साथ आपके PDO dsn
में पैरामीटर ।