2017-01-13 8 views
0

「φ」などのギリシャ文字をOracleに挿入する必要があります。私の既存のDB構造はそれをサポートしていませんでした。調べてみると、さまざまなソリューションが見つかりました.CLOBの代わりにNCLOBを使用するというソリューションを採用しました。私がUnicode、03A6を 'φ'に使用すると、完全にうまく動作し、SQLエディタでUNISTR関数を使用して挿入します。下のようなHibernateがOracleにギリシャ文字を挿入する

UPDATEコンフィグ設定CLOB = UNISTR( '\ 03A6')私は休止状態を使用して、自分のアプリケーションを介して文字を挿入しようとすると、

しかし、それは失敗します。デバッグでは、挿入する前の文字列は '\ u03A6'です。挿入後、私はそれを¿と見ます。

どうすれば解決できますか? UNISTRをどのように利用するのですか?

PN:ネイティブのsqlsまたはhqlsは使用しません。私はテーブルのエンティティオブジェクトを使用します。

編集:使用

Hibernateのバージョンは3.5.6です。これに依存する他の多くのプラグインがあるので、バージョンを変更することはできません。したがって、私は、別の記事で私の脳をラッキングし、非常に多くのオプションを試した後にHibernateエンティティ

+0

文字はデータベースに正しく格納されていますが、(データベースではなく、セッションでギリシャ文字をサポートしない文字セットが使用されるため)画面に正しく表示されない可能性があります。保存されている内容を確認するには、DUMP機能を使用します。たとえば、 'UNISTR( '\ 03A6')、dump(UNISTR( '\ 03A6'))からdualを選択すると、フロントエンドの文字セットがサポートしているので、文字φが表示され、Typ = 1 Len = 2 :3,166 ' - 2バイトのUnicode文字の説明。文字がデータベースに正しく格納されているかどうかを確認するには、DUMP関数を使用します。 – mathguy

+0

実際にはありません。私はDBに格納されていることがわかります。 – Maz

+0

あなたは何を意味するのかよく分かりません。データベースには奇妙なシンボルは格納されず、バイト(0と1)のみが格納されます。あなたのフロントエンドは、あなたが何を使っていても、それらはどんなシンボルでも解釈されます。あなたは文字通りDBに格納されている¿を見ることはできません。私が提案したものを試しましたか?数秒かかるはずです。 – mathguy

答えて

0

に自分のフィールド上@Nationalizedまたは@Type(タイプ=「org.hibernate.type.NClobType」)を使用することはできません最終的に私のコードをJavaで処理するビットを微調整することにしました。休止状態やOracle DBでは処理できません。

DBに挿入する前に、文字列内のユニコード文字を識別し、先頭に&#x、末尾に;を付加してフォーマットします。このエンコードされた文字列は、UTF-8準拠のUI(JSP、HTML)に実際のUnicodeとともに表示されます。以下はコードです。

Formatter formatter = new Formatter(); 
    for (char c : text.toCharArray()) { 
     if (CharUtils.isAscii(c)) { 
      formatter.format("%c", c); 
     } else { 
      formatter.format("&#x%04x;", (int) c); 
     } 
    } 

    String result = formatter.toString(); 

例:

String test = "ABC \uf06c DEF \uf06cGHI"; 

test = "ABC  DEF GHI";

(偶数ワードDOCおよび)UIでレンダリングこの文字列にフォーマットされることが

として表示しますABC  DEF GHI

さまざまなユニコード文字で試してみましたが、うまく動作します。

関連する問題