इसे Mojibake के नाम से जाना जाता है . यह एक डीबी एन्कोडिंग समस्या नहीं है, बल्कि एक HTTP एन्कोडिंग समस्या है। POST अनुरोध वर्ण एन्कोडिंग सेट करना जैसा आपने किया वास्तव में उचित समाधान है।
प्रश्न चिह्न तब होते हैं जब दोनों कनेक्शन के पक्ष जागरूक हैं अपने स्वयं के एन्कोडिंग के। भेजे गए/पुनर्प्राप्त वर्ण जो एक तरफ के एन्कोडिंग द्वारा कवर नहीं किए गए हैं, उन्हें प्रश्न चिह्नों से बदल दिया जाएगा। अरबी वर्ण ISO-8859-1 में नहीं आते हैं और इसलिए उन्हें प्रश्नवाचक चिह्न से बदल दिया जाता है। Mojibake के साथ यही अंतर है जिससे पात्रों को बिना जाँच के भेजा जाता है कि क्या दूसरी तरफ इस्तेमाल किया गया एन्कोडिंग वास्तव में चरित्र का समर्थन करता है। आप गलत तरीके से एन्कोड किए गए वर्णों को समाप्त कर देंगे जो स्वयं को वर्णों के एक अस्पष्ट अनुक्रम के रूप में प्रस्तुत करते हैं।
इस विशेष मामले में, JDBC ड्राइवर स्वयं ही जानता है कि वह डिफ़ॉल्ट रूप से ISO-8859-1 का उपयोग करके वर्णों को DB में संचारित कर रहा है, जबकि पुनर्प्राप्त वर्ण UTF-8 में हैं (MySQL JDBC ड्राइवर DB को नहीं देखता है) तालिका एन्कोडिंग, भले ही यह आपके मामले में यूटीएफ -8 पर ठीक से सेट हो)। डीबी को डेटा ट्रांसमिट करने से पहले वर्णों को डीकोड करने के लिए आपको जेडीबीसी ड्राइवर को यूटीएफ -8 का उपयोग करने के लिए स्पष्ट रूप से बताना होगा। यह JDBC कनेक्शन गुणों के रूप में किया जाना है जिन्हें JDBC URL में क्वेरी स्ट्रिंग पैरामीटर के रूप में परिभाषित किया गया है:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
यदि आप किसी कंटेनर-प्रबंधित डेटा स्रोत का उपयोग कर रहे हैं, तो बस उन गुणों को अलग से उसी तरह निर्दिष्ट करें जैसे आपने उपयोगकर्ता नाम और पासवर्ड के लिए किया था
useUnicode=yes
characterEncoding=UTF-8