Java + Mysql UTF8 Problem
as the title said, I have a problem between java and mysql
The mysql DB, tables, and columns are utf8_unicode_ci. I have an application that took some input from an xml, then compose the query...
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;
}
this method return an array of String that contains one or more SQL insert Query... 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);
둘 다s.execyte
그리고.s.executeUpdate
특수문자는 ?로 저장됩니다.
따라서 특수 Char가 올바르게 저장되지 않습니다.מסירות קצרות
로 저장됩니다.?????????
Hi!
로 저장됩니다.Hi!
Any advice?
Thanks
Solved, I forgot to add the encoding when initializing Connection:
before was:
con = DriverManager.getConnection("jdbc:mysql:///dbname", "user", "pass");
now (working):
con = DriverManager.getConnection("jdbc:mysql:///dbname?useUnicode=true&characterEncoding=utf-8", "user", "pass");
AUGH!
Okay, so, this isn't directly the thing you asked for, but this:
pos[i] = "INSERT INTO table (id, lang, value) VALUES (" +
child.getAttributes().getNamedItem("id").getNodeValue().toString() + " , " +
lang + " , " +
"'" + child.getFirstChild().getTextContent() + "'" +
");";
Set off all my internal "DON'T DO THIS" alarms.
Do you have absolute and complete control over the incoming text? Are you sure someone won't have an apostrophe in the incoming text, even by accident?
Instead of creating SQL text, please refactor your code so that you end up calling:
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();
That is, let the DB escape the text. Please, unless someday you want to have a conversation like this one. As an advantageous side effect, this approach may solve your problem, assuming that the string values are still correct when you read them from the XML. (As someone else mentioned, it's very possible that things are getting messed up when you read from the XML)
ReferenceURL : https://stackoverflow.com/questions/3275524/java-mysql-utf8-problem
'programing' 카테고리의 다른 글
How to export data to CSV in PowerShell? (0) | 2023.09.11 |
---|---|
SQL ID는 같지만 열 값이 다른 두 행 병합(Oracle) (0) | 2023.09.11 |
Unable to start MariaDB - Ubuntu 18.04 (0) | 2023.09.11 |
"기타" 범주의 지정되지 않은 값을 계산하기 위한 쿼리 (0) | 2023.09.11 |
STDOUT을 PHP의 파일로 리디렉션하는 방법? (0) | 2023.09.11 |