2009-04-08 9 views
15

私は2つのMySQLデータベース(UTF-8)、両方のデータベースを同期するJavaコード(Timer Service)第2のデータベースにロードされたデータを修正することを可能にするウェブアプリケーションとを含む。JDBCコネクタを使用してMySQLからJavaからUTF-8データを読み書きする際の問題5.1

私のJavaコードは、最初のデータベースからデータを読み取ると、すべてのデータベース・アクセスは

のiBATISを使って作られた(しかし、私は、私はJDBC、PreparedStatement sおよびResultSet Sを使用して同じ問題を抱えていることを検出)されて、私は'ó'ときのような文字を取得実際は'ó'である必要があります。このデータは、2番目のデータベースに変更を加えることなく失われます。

その後、Webアプリケーションでロードされたデータが表示されると、<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />にもかかわらず、範囲外の文字が表示されます。私は...

new String(data.getBytes("UTF-8")); 

を使用してデータをデコードした場合

...私は正しく文字(O)を可視化します。しかし、Webアプリケーションフォームを使用してデータを変更すると、データベースがUTF-8であり、接続文字列がcharacterEncodingを使用していても、2番目のデータベースのUTF-8でデータが更新されないため、 characterSetResultsおよびuseUnicodeパラメータ)。私は、次のデータベース設定を取得し、私のJavaコードから

character_set_client-->utf8 
character_set_connection-->utf8 
character_set_database-->utf8 
character_set_filesystem-->binary 
character_set_results-->utf8 
character_set_server-->latin1 
character_set_system-->utf8 
character_sets_dir-->/usr/local/mysql51/share/mysql/charsets/ 

character_set_serverの設定を変更することはできませんし、私は私が間違っているのかわかりません!

JDBCコネクタ(mysql-connector-java-5.1.5-bin.jar)を使用してMySQLからUTF-8データを読み取るにはどうすればよいですか?

最初のデータベースからのデータの読み取りまたは2番目のデータベースへの書き込みに問題がありますか?

答えて

5

JVMのfile.encodingプロパティをUTF-8に設定すると、すべてのロケール/エンコーディング機密APIはデコードされた文字列をUTF8とみなします。例えば

、あなたはあなたのJavaアプリを起動し、コマンドラインでそれを設定することができます。

java -Dfile.encoding=UTF-8 .... 

また、Tomcatの設定の完全な説明についてthis SO questionを参照することができます。

5

チェーンのある時点で、UTF-8 –エンコードされたバイトがLatin1でデコードされています。あなたの設定のリストから、これは "character_set_server"で起きているようです。これらの値がどのように得られたかを知らなければ、それらを解釈することは困難です。

system property "file.encoding"の値を確認してください。これが "UTF-8"でない場合は、バイトを文字にデコードするたびに、文字エンコードとして明示的に "UTF-8"を指定する必要があります。たとえば、コンストラクタをbyte[]と呼び出すか、InputStreamReaderを使用します。

デフォルトのプラットフォームエンコーディングに頼るのではなく、文字エンコーディングを明示的に指定することをお勧めします。少し遅れて

+0

が存在する必要があります。 UTF-8の後。 –

+0

@ScottChu申し訳ありませんが、私はあなたのコメントを理解していません。 – erickson

37

が、これはあなたを助ける:

DriverManager.getConnection(
      "jdbc:mysql://" + host + "/" + dbName 
      + "?useUnicode=true&characterEncoding=UTF-8", user, pass); 
+0

一般的なアプリケーションでは、アプリケーションを作成しません。したがって、このパラメータを渡すことはできません。私はそれを変更することができます読書の後に他の方法はありますか? –

関連する問題