web-dev-qa-db-ja.com

JDBCコネクタ5.1を使用してJava)からMySQLでUTF-8データを読み書きする際の問題

2つのMySQLデータベース(UTF-8)、a Javaコード(タイマーサービス))を使用して、両方のデータベースを同期するシナリオがあります(最初にフォームを読み取り、2番目に書き込み/更新します)。 2番目のデータベースにロードされたデータを変更できるWebアプリケーション。

すべてのデータベースアクセスはIBATISを使用して行われます(ただし、JDBC、PreparedStatementsおよびResultSetsを使用しても同じ問題があることがわかりました)

私のJavaコードが最初のデータベースからデータを読み取るとき、実際には'ó'でなければならないのに、'ó'のような文字を取得します。このデータは、2番目のデータベースに変更を加えることなく書き込まれます。

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

を使用してデータをデコードすると...

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

...文字(ó)を正しく視覚化します。ただし、Webアプリケーションフォームを使用してデータを変更すると、2番目のデータベースのUTF-8でデータが更新されないため(データベースがUTF-8であり、接続文字列がcharacterEncodingを使用しているにもかかわらず)、このソリューションを原則として使用することはできません。 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番目のデータベースへの書き込みに問題がありますか?

15
Cesar

少し遅れますが、これはあなたを助けます:

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

JVMのfile.encodingプロパティをUTF-8に設定して、すべてのロケール/エンコーディングに依存するAPIがデコードされた文字列をUTF8と見なすようにすることができます。

たとえば、Java app:を起動するコマンドラインで設定できます。

Java -Dfile.encoding=UTF-8 ....

Tomcatのセットアップの完全な説明については、 this SO question )を参照することもできます。

5
chburd

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

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

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

5
erickson