いくつかの異なる方法でエンコードされているが、テーブル内の単一の列に保持されているテキストに問題があります。長い話。MySQL では、「select hex(str) from table where」を実行でき、文字列のバイトを設定したとおりに正確に表示できます。
Oracle では、Unicode 文字 0x0130 "LATIN CAPITAL LETTER WITH DOT ABOVE" であるトルコ文字 İ で始まる文字列があります。これは、印刷された Unicode Version 2.0 ブックにあります。UTF-8 では、この文字は 0xc4b0 です。
サポートが必要な非常に古いクライアント アプリがあります。彼らはこのテキストを「windows-1254」で送信します。以前は目を閉じて保管し、後で返すだけでした。現在、Unicode が必要であるか、Unicode が与えられています。
ので、私は持っています:
SQL> select id, name from table where that thing;
ID NAME
------ ------------------------
746 Ý
"İ" は Windows-1254 では 0xdd であり、windows-1252 では 0xdd は "Ý" であるため、これは理にかなっています。私の端末はおそらく通常のwindows-1252に設定されています。
しかし:
SQL> select id, rawtohex(name) from table where that thing;
ID RAWTOHEX(NAME)
------ ------------------------
746 C39D
MySQL には hex(name) 関数に相当するものはないようです。しかし、私は何かが欠けているに違いありません。ここで何が欠けていますか?
私の Java コードは、提供された utf8 を取得し、utf8 のコピーと windows-1252 のコピーを保存する必要があります。Javaコードは私に与えます:
bytes (utf8): c4 b0
bytes (1254): dd
それでも、保存すると、クライアントは正しい文字を取得しません。そして、Oracleが実際に保存したものを確認しようとすると、上記のゴミが表示されます。C39Dがどこから来たのかわかりません。助言がありますか?
すべてのアプリケーションに ojdbc14.jar が組み込まれており、「Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production」というデータベースに接続しています。