2つのMySQLデータベース(UTF-8)、a Javaコード(タイマーサービス))を使用して、両方のデータベースを同期するシナリオがあります(最初にフォームを読み取り、2番目に書き込み/更新します)。 2番目のデータベースにロードされたデータを変更できるWebアプリケーション。
すべてのデータベースアクセスはIBATISを使用して行われます(ただし、JDBC、PreparedStatement
sおよびResultSet
sを使用しても同じ問題があることがわかりました)
私の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番目のデータベースへの書き込みに問題がありますか?
少し遅れますが、これはあなたを助けます:
DriverManager.getConnection(
"jdbc:mysql://" + Host + "/" + dbName
+ "?useUnicode=true&characterEncoding=UTF-8", user, pass);
JVMのfile.encoding
プロパティをUTF-8に設定して、すべてのロケール/エンコーディングに依存するAPIがデコードされた文字列をUTF8と見なすようにすることができます。
たとえば、Java app:を起動するコマンドラインで設定できます。
Java -Dfile.encoding=UTF-8 ....
Tomcatのセットアップの完全な説明については、 this SO question )を参照することもできます。
チェーンのある時点で、UTF-8でエンコードされたバイトがLatin1でデコードされています。設定のリストから、これは「character_set_server」で発生しているようです。これらの値がどのように取得されたかを知らなければ、それらを解釈することは困難です。
システムプロパティ "file.encoding"の値を確認してください。それが「UTF-8」でない場合は、バイトを文字にデコードするたびに、文字エンコードとして「UTF-8」を明示的に指定する必要があります。たとえば、byte[]
を使用してString
コンストラクターを呼び出す場合、またはInputStreamReader
を使用する場合です。
デフォルトのプラットフォームエンコーディングに依存するのではなく、文字エンコーディングを明示的に指定することをお勧めします。