6

oracle10gデータベースに次の「変換」テーブルがあります。

ID  VARCHAR2(100 BYTE)
LANGUAGE    CHAR(2 BYTE)
COUNTRY CHAR(2 BYTE)
TRANSLATION NVARCHAR2(2000 CHAR)
TRACK_TIMESTAMP DATE
TRACK_USER  VARCHAR2(2000 BYTE)

私がこれをやろうとすると:

update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr';

次に、これを実行します。

select * from translation where id = 'MY_ID' and language = 'fr';

と翻訳の列が表示されます:Sの代わりにœ、私は理由がわかりません。

従来の問題のため、データベース全体をUTF-8を使用するように変換できません。他にオプションはありますか?

現在、国別文字セットはAL16UTF16です。通常の文字セットはWE8ISO8859P1です。

私は現在Java1.6を使用しています

上記は簡略化した例です。実際のアプリケーションでのクエリは次のようになります。

UPDATE TRANSLATION SET TRANSLATION=? WHERE TRANSLATION.COUNTRY=? and TRANSLATION.ID=? and TRANSLATION.LANGUAGE=? 1=1,800 - 2,500 œufs par heure 2=CA 3=3_XT_FE_ECS18 4=fr

ここでの問題は、追加する代わりに追加するœufsことです¿ufs

4

1 に答える 1

1

ハードコードされたリテラルではなくバインド変数を使用しているため、Unicode文字列をUPDATEステートメントに渡すことができるはずです。

ストレートJDBCを使用してデータベースに書き込む場合は、JDBC開発者ガイドにNVARCHAR2列へのデータの書き込みに関する例があります。1.5 JVMを使用している場合は、NVARCHAR2列ごとにOraclePreparedStatement.setFormOfUse呼び出しを使用する必要があります。1.6 JVMでは、JDBC 4.0がNCHARおよびNVARCHAR2タイプを追加したため、作業が楽になります。1.5 JVMを使用している場合、SpringのようなORMフレームワークにJDBCのOracle拡張機能を使用させることは簡単な作業ではないかもしれません。私はSpringに精通していないので、それを実現するためにどのような手順が必要になるかを知ることができません。

場合によっては、接続文字列を変更してdefaultNChar=trueを指定できる可能性があります。これにより、ドライバーは国別文字セットを使用してすべての文字列を処理するように強制されます。SpringにOraclePreparedStatement拡張機能を使用させなくても、問題を解決するにはこれで十分な場合があります。

于 2011-06-07T15:20:17.757 に答える