■ Java Runtime Environment - Java VMは、JDKのJava VMに基づくもので、データベー
ス・サーバーに統合されてJavaクラスの実行を可能にします。データベースに格納さ れたJavaクラスを管理するライブラリ・マネージャなどの、サポート用サービス・
セットが付属しています。
■ CORBAのサポート - Java Runtime Environmentの他、OracleはCORBA Object Request
Broker(ORB)をデータベース・サーバーに統合して、データベースをCORBAサー
バーとして使用できるようにします。すべてのCORBAクライアントから、データベー ス・サーバーのORBに公開されたJava CORBAオブジェクトをコールできます。
■ EJBのサポート - Enterprise Java Bean バージョン1.0コンテナは、データベース・サー バー上に作成されて、EJBの開発および配布用のプラットフォームを提供します。
JDBC
次の項目について説明します。
■ JDBCクラス・ライブラリ
■ JDBC OCIドライバ
■ JDBC Thinドライバ
■ JDBCサーバー・ドライバ
■ oracle.sql.CHARクラス
■ NLS制限事項
Oracle JDBCドライバは、Oracleがサポートするすべてのキャラクタ・セットのデータベー
スにおいてデータの取出しと挿入を可能にすることにより、グローバル化を提供します。
Javaの文字列は、JDBCプログラム用のUCS2コード(16ビット Unicode)であるため、ク ライアントのターゲット・キャラクタ・セットは常にUCS2です。データを、データベー ス・キャラクタ・セット(Db Charset)からUCS2に変換するには、キャラクタ・セット変 換が必要です。これは、CHAR、LONG、CLOBおよびVARCHAR2データ型に適用されま す。RAWデータは変換されません。
次に、NLSキャラクタ・セット変換に関係の深いJDBC用のJavaメソッドのうち、一般的 なものをいくつか示します。
■ java.sql.ResultSetのメソッドgetString()およびgetUnicodeStream()は、
データベースからの値をJava文字列およびUnicode文字のストリームとして戻します。
■ oracle.sql.CLOBのメソッドgetCharacterStream()は、CLOBの内容をUnicode ストリームとして戻します。
■ oracle.sql.CHARのメソッドgetString()、toString()および getStringWithReplacement()。
JDBC
OracleのドライバがJavaアプリケーション用に実行するキャラクタ・セット変換の方法は、
データベースが使用するキャラクタ・セットによって異なります。最も変換が簡単なのは、
データベースがUS7ASCIIまたはWE8ISO8859P1キャラクタ・セットを使用している場合 です。この場合、ドライバは、データをデータベース・キャラクタ・セットからJavaアプ リケーションが使用するUCS2に直接変換します。
US7ASCIIまたはWE8ISO8859P1以外のキャラクタ・セット(たとえば、日本語、韓国語な
ど)を使用するデータベースを取り扱う場合、ドライバは、まずデータをUTF8に変換し て、次にUCS2に変換します。
図6-1に、JDBCドライバのデータ変換の流れを示します。
注意 注意注意
注意: JDBCドライバは、ユーザーが意識しないところで、すべてのキャ ラクタ・セット変換を実行します。変換時には、ユーザーからの操作は必 要ありません。
JDBC
図 図図
図6-1 JDBCドライバのデータ変換ドライバのデータ変換ドライバのデータ変換ドライバのデータ変換
JDBC クラス・ライブラリ クラス・ライブラリ クラス・ライブラリ クラス・ライブラリ
JDBCクラス・ライブラリは、JDBCインタフェースを実現するJavaレイヤーです。Javaア プリケーション、アプレットおよびストアド・プロシージャは、このレイヤーと対話しま す。ライブラリは、常にUS7ASCII、UTF8またはWE8ISO8859P1コードの文字列データを、
JDBCドライバの入力ストリームから受け取ります。また、JDBCサーバー側ドライバは、
UCS2も受け取ります。JDBCクラス・ライブラリは、入力ストリームをクライアント・ア プリケーションに引き渡す前に、UCS2に変換します。入力ストリームがUTF8の場合、
JDBCクラス・ライブラリは、UTF8-to-UCS2変換アルゴリズムで定義されたビット処理を 使用して、UTF8コードの文字列をUCS2に変換します。入力ストリームがUS7ASCIIまた
はWE8ISO8859P1の場合は、バイトをJavaキャラクタにキャストすることにより、入力文
字列をUCS2に変換します。これは、US7ASCIIキャラクタ・セットの場合はUCS2の最初
Javaストアド・
プロシージャ、
CORBAオブジェクト またはEJB
CのJDBCサーバー・
ドライバ
Oracle8i データベース・
キャラクタ・
セット
データベース・
キャラクタ・セット データベース・
キャラクタ・セット Java文字列
UCS2 UTF8 WE8ISO8859PI US7ASCII サーバー
Java文字列
UTF8 WE8ISO8859PI US7ASCII
UTF8 WE8ISO8859PI US7ASCII Java文字列
データベース・キャラクタ・セット UTF8
WE8ISO8859PI US7ASCII
クライアント
SQLエンジン または PL/SQLエンジン Javaアプレット
JDBC Thin
(JavaのJava ソケットをコール)
Javaアプリケーション
JDBC OCI
(CのOracle OCI をコール)
JavaのJDBCクラス・ライブラリ
Net8
JDBC
の128文字、WE8ISO8859P1キャラクタ・セットの場合はUCS2の最初の256文字に基づい ています。WE8ISO8859P1およびUS7ASCIIを個別に取り扱うことにより、UTF8へのビッ ト変換をなくして、一般的に使用されるシングルバイト・クライアントのパフォーマンスを 改善します。
データベースの接続時、JDBCクラス・ライブラリは、サーバーのNLS_LANGUAGEおよ
びNLS_TERRITORYパラメータを設定して、JDBCドライバを実行するJavaVMのロケール
に対応させます。この操作は、JDBC OCIドライバおよびJDBC Thinドライバでのみ実行さ れ、これによって、サーバーとJavaクライアントが確実に同じ言語で通信できるようにな ります。その結果、サーバーから戻るOracleエラー・メッセージは、クライアント・ロ ケールと同じ言語になります。
JDBC OCI ドライバ ドライバ ドライバ ドライバ
JDBC OCIドライバ・インストールでは、データベース・キャラクタ・セットのみでなく、
クライアント側にもキャラクタ・セットがあります。クライアント・キャラクタ・セット は、クライアントのインストール時に、環境変数NLS_LANGの値により決定されます。
データベース・キャラクタ・セットは、データベースの作成時に決定されます。クライアン トが使用するキャラクタ・セットは、サーバー上のデータベースが使用するキャラクタ・
セットとは異なる場合があります。このため、キャラクタ・セット変換の実行時、JDBC OCIドライバは、次の3つを考慮する必要があります。
■ データベースのキャラクタ・セットおよび言語
■ クライアントのキャラクタ・セットおよび言語
■ Javaアプリケーションのキャラクタ・セット
JDBC OCIドライバは、データベースのキャラクタ・セットで、データをサーバーからクラ
イアントに送ります。環境変数NLS_LANGの値により、ドライバは、次のいずれかの方法 でキャラクタ・セット変換を操作します。
■ NLS_LANGに値が指定されていない場合、またはNLS_LANGにUS7ASCIIまたは
WE8ISO8859P1キャラクタ・セットが設定されている場合、JDBC OCIドライバはJava
を使用して、JDBCクラス・ライブラリ内でキャラクタ・セットをUS7ASCIIまたは
WE8ISO8859P1からUCS2に直接変換します。
■ NLS_LANGにUS7ASCIIまたはWE8ISO8859P1以外のキャラクタ・セットが設定され
ている場合、ドライバは、クライアントのNLS_LANGパラメータの値をUTF8に変更 します。これは自動的に行われ、ユーザーからの操作は不要です。OCIは、
NLS_LANGの値を使用してデータをデータベース・キャラクタ・セットからUTF8に
変換します。そして、OCI JDBCドライバは、UTF8からUCS2へ変換するJDBCクラ ス・ライブラリにデータを引き渡します。
JDBC
JDBC Thin ドライバ ドライバ ドライバ ドライバ
アプリケーションまたはアプレットがJDBC Thinドライバを使用する場合、Oracleクライ アントのインストールは行われません。このため、C言語のOCIクライアント変換ルーチン は使用できません。この場合、クライアント変換ルーチンは、JDBC OCIドライバとは異な るものになります。
データベース・キャラクタ・セットがUS7ASCIIまたはWE8ISO8859P1の場合、データは 変換されずにクライアントに送られます。そして、ドライバは、キャラクタ・セットをJava のUCS2に変換します。
データベース・キャラクタ・セットがUS7ASCIIまたはWE8ISO8859P1以外である場合、
サーバーは、クライアントに送る前にデータをUTF8に変換します。クライアントでは、
JDBC ThinドライバがJavaでデータをUCS2に変換します。
JDBC サーバー・ドライバ サーバー・ドライバ サーバー・ドライバ サーバー・ドライバ
Javaクラスは、Oracle8iサーバーのJava VM上で動作するので、SQL処理でSQLエンジン
またはPL/SQLエンジンと対話するために、JDBCサーバー・ドライバが使用されます。
JDBCサーバー・ドライバは、Oracleサーバー・プロセスと同じアドレス空間で動作するた め、SQLエンジンまたはPL/SQLエンジンにはローカル・ファンクション・コールを行い ます。SQLエンジンまたはPL/SQLエンジンに送られるデータまたは戻されるデータは、
データベース・キャラクタ・セットにコード化されます。データベース・キャラクタ・セッ
トがUS7ASCII、WE8ISO8859P1またはUTF8の場合、JDBCサーバー・ドライバでは変換
は行われず、データはそのままJDBCクラス・ライブラリとの間でやり取りされます。それ 以外のキャラクタ・セットの場合、JDBCサーバー・ドライバは、クラス・ライブラリと データのやり取りを行う前に、データをデータベース・キャラクタ・セットからUCS2に変 換します。この場合、クラス・ライブラリが変換を行う必要はありません。
注意注意注意 注意:
■ JDBC OCIドライバは、NLS_LANGをUTF8に設定することで、Java
で実行される変換の回数を最小限にします。このドライバは、データ ベース・キャラクタ・セットからUTF8への変換をC言語で実行しま す。
■ UTF8への変更は、JDBCアプリケーション・プロセスに対してのみ行 われます。
■ NLS_LANGパラメータの詳細は、2-4ページ「NLS_LANGを使用し
たロケールの選択」を参照してください。
注意注意注意
注意: OCIドライバおよびThinドライバは、いずれも同じNLSを自動 的に提供します。