2010-07-18 6 views
31

как сказал название, у меня есть проблема между Java и MySQLJava + Mysql UTF8 Проблема

для MySQL БД, таблицы и столбцы 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; 
} 

этот метод возвращает массив String, который содержит один или несколько SQL вставки запроса ... затем

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

Как вы читаете исходный XML? Это происходит из файла или это строка из веб-службы или что-то еще? Возможно, что исходное чтение xml вызывает проблему. –

+0

это строка из webservice, я использую db.parse ("http: // ......"), чтобы получить содержимое xml ... – 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.html – tObi

11

AUGH!

Хорошо, так, что это не непосредственно вещь, которую вы просили, но это:

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

Зачет все мое внутреннее «Не делайте этого» тревоги.

У вас есть абсолютный и полный контроль над входящим текстом? Вы уверены, что кто-то не будет иметь апостроф во входящем тексте, даже случайно?

Вместо создания SQL текста, пожалуйста реорганизовать код так, что вы в конечном итоге вызова:

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(); 

То есть, пусть DB избежать текста. Пожалуйста, если вы когда-нибудь захотите поговорить, как this one. В качестве предпочтительного побочного эффекта этот подход может решить вашу проблему, считая, что строковые значения по-прежнему верны, когда вы читаете их из XML. (Как кто-то упомянул, очень возможно, что все становится испорченным, когда вы читаете из XML)

+0

да, я знаю, я написал этот способ, чтобы дать вам более легкий код;) – Marcx

+0

lol. Я могу понять побочный комментарий, но неторопливый ответ на беднягу? -1 – kellogs

+0

@DanielMartin +1, есть способ получить окончательную строку запроса из 'pstmt' после того, как вы установите все ее значение, мне нужно знать, что я могу регистрировать, какой запрос выполнялся. – Watt