Java + Mysql UTF8 Problem

Jak napisano w tytule mam problem miedzy java a mysql

Mysql DB, tabele i kolumny to utf8_unicode_ci. Mam aplikację, która pobrała trochę danych wejściowych z xml, a następnie skomponowała zapytanie...

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;
}

Ta metoda zwraca tablicę łańcuchów zawierających jedno lub więcej zapytań SQL insert... then

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

Zarówno z s.execyte jak i s.executeUpdate znaki specjalne są zapisywane jako ?

Więc specjalne znaki nie są poprawnie zapisywane: מסירות קצרות jest przechowywany jako ?????????

Hi! jest przechowywany jako Hi!

Jakieś rady?

Dzięki

Author: Marcx, 2010-07-18

2 answers

Rozwiązany, Zapomniałem dodać kodowanie podczas inicjalizacji połączenia:

Wcześniej było:

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

Teraz (działa):

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

 80
Author: Marcx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 13:23:41

/ Align = "left" /

Ok, więc to nie jest bezpośrednio rzecz, o którą prosiłeś, ale to:

 pos[i] =  "INSERT INTO table (id, lang, value) VALUES (" +
    child.getAttributes().getNamedItem("id").getNodeValue().toString() + " , " +
    lang + " , " + 
    "'" + child.getFirstChild().getTextContent() + "'" +
    ");";       
Włącz wszystkie moje wewnętrzne alarmy "nie rób tego".

Czy masz absolutną i pełną kontrolę nad przychodzącym tekstem? Jesteś pewien, że ktoś nie będzie miał apostrofu w przychodzącym tekście, nawet przez przypadek?

Zamiast tworzyć tekst SQL, proszę refaktorować swój kod, aby zakończyć wywołanie:

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

To znaczy niech DB ucieka od tekstu. Proszę, chyba że pewnego dnia chcesz mieć rozmowę jak Ten . Jako korzystny efekt uboczny, takie podejście Może rozwiązać twój problem, zakładając, że wartości ciągu znaków są nadal poprawne podczas odczytywania ich z XML. (Jak ktoś inny wspomniał, jest bardzo możliwe, że rzeczy są coraz popaprane, gdy czytasz z XML)

 11
Author: Daniel Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 13:24:41