web-dev-qa-db-ja.com

Java + Mysql UTF8の問題

タイトルが言ったように、私はJavaとmysqlの間に問題があります

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

このメソッドは、1つ以上の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.execytes.executeUpdateの両方で、特殊文字は?

そのため、特殊文字は正しく保存されません:מסירות קצרות?????????として保存されます

Hi!Hi!として保存されます

何かアドバイス?

ありがとう

36
Marcx

解決済み、私は接続を初期化するときにエンコーディングを追加するのを忘れていました:

以前は:

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

現在(動作中):

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

91
Marcx

ああ!

さて、だから、これはあなたが求めたものではありません直接ではありませんが、これは:

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

内部の「DO N'T DO THIS THIS」アラームをすべてオフにします。

着信テキストを完全かつ完全に制御していますか?偶然であっても、誰かが受信テキストにアポストロフィを付けないようにしますか?

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から読み取るときに物事がめちゃくちゃになる可能性は非常に高いです)

11
Daniel Martin