17

いくつかの異なる方法でエンコードされているが、テーブル内の単一の列に保持されているテキストに問題があります。長い話。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」というデータベースに接続しています。

4

2 に答える 2