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!
Dzięki
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");
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)
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