2010-07-18 18 views
31

के रूप में शीर्षक कहा, मैं जावा और mysqlजावा + MySQL UTF8 समस्या

mysql DB, तालिकाओं और स्तंभों utf8_unicode_ci के बीच एक समस्या है। मैं एक आवेदन है कि एक xml से कुछ इनपुट ले लिया है, तो क्वेरी रचना ...

public String [] saveField(String xmltag, String lang){  
    NodeList nodo = this.doc.getElementsByTagName(xmltag); 
    String [] pos = new String[nodo.getLength()];  
    for (int i = 0 ; i < nodo.getLength() ; i++) { 
    Node child = nodo.item(i); 
    pos[i] = "INSERT INTO table (id, lang, value) VALUES (" + 
     child.getAttributes().getNamedItem("id").getNodeValue().toString() + " , " + 
     lang + " , " + 
     "'" + child.getFirstChild().getTextContent() + "'" + 
     ");";  
    } 
    return pos; 
} 

इस विधि स्ट्रिंग जो एक या अधिक एसक्यूएल डालने क्वेरी शामिल की एक सरणी लौट ... तो

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
con = DriverManager.getConnection("jdbc:mysql:///dbname", "user", "pass"); 
..... 
Statement s; s = 
this.con.createStatement(); 
s.execute(query); 

s.execyte और s.executeUpdate दोनों के साथ विशेष वर्णों को संग्रहीत किया जाता है?

ऐसी क्या खास बात चार सही ढंग से संग्रहीत नहीं हैं: מסירות קצרות?????????

Hi! के रूप में संग्रहीत किया जाता है के रूप में Hi!

किसी भी सलाह संग्रहीत किया जाता है?

धन्यवाद

+1

आप स्रोत एक्सएमएल कैसे पढ़ रहे हैं? क्या यह एक फाइल से आ रहा है या यह एक वेब सेवा से एक स्ट्रिंग है, या कुछ और? यह संभव है कि आप एक्सएमएल की मूल पढ़ाई समस्या पैदा कर रहे हैं। –

+0

यह एक webservice से एक स्ट्रिंग है, मैं xml सामग्री प्राप्त करने के लिए db.parse ("http: // ......") का उपयोग करता हूं ... – Marcx

उत्तर

72

हल, मैं जब कनेक्शन शुरू हो एन्कोडिंग जोड़ने के लिए भूल गया:

पहले था:

con = DriverManager.getConnection("jdbc:mysql:///dbname", "user", "pass");

अब

(कार्य):

con = DriverManager.getConnection("jdbc:mysql:///dbname?useUnicode=true&characterEncoding=utf-8", "user", "pass");

+0

यह utf8 नहीं होना चाहिए? https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets।एचटीएमएल – tObi

11

AUGH!

ठीक है, तो, यह नहीं सीधे बात आप के लिए कहा है, लेकिन यह है:

pos[i] = "INSERT INTO table (id, lang, value) VALUES (" + 
    child.getAttributes().getNamedItem("id").getNodeValue().toString() + " , " + 
    lang + " , " + 
    "'" + child.getFirstChild().getTextContent() + "'" + 
    ");";  

बंद सेट सब मेरी आंतरिक "DO है कि यह" अलार्म।

क्या आपके पास आने वाले पाठ पर पूर्ण और पूर्ण नियंत्रण है? क्या आप सुनिश्चित हैं कि आने वाले पाठ में किसी व्यक्ति को दुर्घटना से भी एस्ट्रोफ़े नहीं होगा?

PreparedStatement pstmt = 
    con.prepareStatement("INSERT INTO table (id, lang, value) VALUES (?,?,?)"); 
// then, in a loop: 
pstmt.setString(0, child.getAttributes().getNamedItem("id").getNodeValue().toString()); 
pstmt.setString(1, lang); 
pstmt.setString(2, child.getFirstChild().getTextContent()); 
pstmt.execute(); 

है, डीबी पाठ भागने करते हैं:

ताकि आप अंत बुला बजाय एसक्यूएल पाठ बनाने के लिए, अपने कोड refactor करें। कृपया, जब तक कि आप किसी दिन बातचीत करना चाहते हैं जैसे this one। एक फायदेमंद दुष्प्रभाव के रूप में, यह दृष्टिकोण आपकी समस्या का समाधान कर सकता है, यह मानते हुए कि जब आप उन्हें XML से पढ़ते हैं तो स्ट्रिंग मान अभी भी सही होते हैं। (जैसा कि किसी और ने उल्लेख किया है, यह बहुत संभव है कि जब आप एक्सएमएल से पढ़ते हैं तो चीजें गड़बड़ हो रही हैं)

+0

हाँ मुझे पता है, मैंने आपको हल्का कोड देने के लिए इस तरह लिखा है;) – Marcx

+0

लॉल। मैं एक साइड टिप्पणी समझ सकता हूं लेकिन गरीब साथी पर जवाब लेने का जवाब? -1 – kellogs

+0

@DanielMartin +1, आपके सभी मूल्य निर्धारित करने के बाद 'pstmt' से अंतिम क्वेरी स्ट्रिंग प्राप्त करने का कोई तरीका है, मुझे यह जानना होगा कि मैं कौन सी क्वेरी निष्पादित कर रहा हूं लॉग कर सकता हूं। – Watt

संबंधित मुद्दे