19 グローバリゼーション・サポート

Oracle Java Database Connectivity(JDBC)ドライバは、グローバリゼーション・サポート(以前のNational Language Support(NLS))を提供しています。グローバリゼーション・サポートにより、Oracleがサポートする任意の文字セットで、データの取出しやデータベースへのデータの挿入が可能です。クライアントとサーバーで異なる文字セットを使用する場合、ドライバでは、データベース文字セットとクライアント文字セット間の変換がサポートされます。

この章の構成は、次のとおりです。

ノート:

  • Oracle Database 10g以上では、NLS_LANG変数がJDBCグローバリゼーション・メカニズムに組み込まれていません。JDBCドライバは、NLS環境をチェックしません。そのため、この変数を設定しても効果はありません。

  • JDBCサーバー側内部ドライバは完全なグローバリゼーション・サポートを提供し、グローバリゼーション拡張ファイルを必要としません。

  • JDBC 4.0には各国語文字セットの値を読書きするためのメソッドが含まれています。JSE 6以上を使用する場合はこれらのメソッドを使用してください。

19.1 グローバリゼーション・サポートの提供について

基本Javaアーカイブ(JAR)ファイル(ojdbc7.jar)には、次の項目に対して完全なグローバリゼーション・サポートを提供するために必要なすべてのクラスが含まれています。

  • Oracleオブジェクトまたはコレクション型のデータ・メンバーとして取得または挿入されないCHARVARCHARLONGVARCHARまたはCLOBデータ用のOracle文字セット

  • 文字セットUS7ASCIIWE8DECWE8ISO8859P1WE8MSWIN1252およびUTF8に対するオブジェクトおよびコレクションのCHARまたはVARCHARデータ・メンバー

前述以外の文字セットをオブジェクトまたはコレクションのCHARまたはVARCHARデータ・メンバーで使用するには、CLASSPATH環境変数にorai18n.jarを含める必要があります。

ORACLE_HOME/jlib/orai18n.jar

ノート:

以前のリリースでは、nls_charset12.zipファイルが必要でした。このファイルは現在使用されません。

orai18n.jarの縮小

orai18n.jarファイルには、多数の重要な文字セットとグローバリゼーション・サポート・ファイルが含まれています。組込みのカスタマイズ・ツールを使用して、次のようにorai18n.jarファイルのサイズを縮小できます。

java -jar orai18n.jar -custom-charsets-jar [jar/zip_filename] -charset characterset_name [characterset_name ...]

たとえば、文字セットJA16SJISおよびJA16EUCを含むカスタムの文字セット・ファイルcustom_orai18n_ja.jarを作成する場合は、次のコマンドを発行します。

$ java -jar orai18n.jar -custom-charsets-jar custom_orai18n_ja.jar -charset JA16SJIS JA16EUC

コマンドの出力は次のようになります。

Added Character set : JA16SJIS
Added Character set : JA16EUC

カスタムのJAR/ZIPファイルにファイル名を指定しない場合、jdbc_orai18n_cs.jarという名前のファイルが現行作業ディレクトリに作成されます。また、カスタムのJAR/ZIPファイルに、orai18nで始まる名前を指定することはできません。

無効またはサポートされていない文字セットをコマンドに指定した場合、JAR/ZIPファイルは出力されません。カスタムのJAR/ZIPファイルは更新または削除されません。

カスタムの文字セットJAR/ZIPはコマンドを受け入れません。ただし、バージョン情報およびJAR/ZIPファイルの生成に使用されたコマンドは出力されます。たとえば、jdbc_orai18n_cs.zipを設定した場合、情報を表示するコマンドおよび表示される情報は次のようになります。

$ java -jar jdbc_orai18n_cs.jar
Oracle Globalization Development Kit - 12.1.X.X.X Release
This custom character set jar/zip file was created with the following command:
java -jar orai18n.jar -custom-charsets-jar jdbc_orai18n_cs.jar -charset WE8ISO8859P15

指定できる文字セットの数は、オペレーティング・システムのシェルまたはコマンド・プロンプトの制限によって決まります。サポートされている文字セットはすべてコマンドで指定できます。

ノート:

カスタム文字セットを使用する場合、JDBCがカスタム文字セットをサポートするためには、次の操作を実行する必要があります。

  1. カスタム文字セットの作成プロセスで.nltおよび.nlbファイルを作成した後で、次のコマンドを使用して、新たに作成した文字セットとlx0boot.nltファイルのために.glbファイルを作成します。

    java -classpath $ORACLE_HOME/jlib/orai18n.jar:$ORACLE_HOME/lib/xmlparserv2.jar Ginstall -[add | a] <NLT_file_name>
  2. カスタム文字セットを使用してデータベースに接続するJDBCコードを実行する場合は、生成したファイルと$ORACLE_HOME/jlib/orai18n-mappings.jarclasspath環境変数に追加します。

19.2 NCHAR、NVARCHAR2、NCLOBおよびdefaultNCharプロパティ

デフォルトでは、oracle.jdbc.OraclePreparedStatementインタフェースにより、すべての列のデータ型は、列がデータベース文字セットでエンコードされるのと同じように処理されます。ただし、Oracle Database 10g以上では、oracle.jdbc.defaultNCharの値をtrueに設定すると、すべてのキャラクタ列がJDBCにより各国語として処理されます。

defaultNCharのデフォルト値はfalseです。defaultNCharの値がfalseである場合、特に各国語文字が必要な列のために、setFormOfUse(<column_Index>, OraclePreparedStatement.FORM_NCHAR)メソッドをコールする必要があります。次に例を示します。

PreparedStatement pstmt =
conn.prepareStatement("insert into TEST values(?,?,?)");
pstmt.setFormOfUse(1, OraclePreparedStatement.FORM_NCHAR);
pstmt.setString(1, myUnicodeString1); // NCHAR column
pstmt.setFormOfUse(2, OraclePreparedeStatement.FORM_NCHAR);
pstmt.setString(2, myUnicodeString2); // NVARCHAR2 column

defaultNCharの値をtrueと設定する場合、コマンドラインで次のように指定します。

java -Doracle.jdbc.defaultNChar=true myApplication

必要に応じて、アプリケーションでdefaultNCharを接続プロパティとして指定してNCHARNVARCHAR2またはNCLOBデータにアクセスすることもできます。

Properties props = new Properties();
props.put(OracleConnection.CONNECTION_PROPERTY_DEFAULTNCHAR, "true");
// set URL, username, password, and so on.
...
Connection conn = DriverManager.getConnection(props);

defaultNCharの値がtrueである場合、各国語文字が必要でない列のために、setFormOfUse(<column_Index>, FORM_CHAR)をコールする必要があります。次に例を示します。

PreparedStatement pstmt =
conn.prepareStatement("insert into TEST values(?,?,?)");
pstmt.setFormOfUse(3, OraclePreparedStatement.FORM_CHAR);
pstmt.setString(3, myString); // CHAR column

ノート:

defaultNCharの値をtrueに設定してからCHAR列にアクセスした場合、データベースでは、すべてのCHARデータを暗黙的にNCHARに変換します。この変換は、パフォーマンスに多大な影響を与えます。

ノート:

  • 文字データには、必ずoracle.sql.CHARでなくjava.lang.Stringを使用します。CHARは下位互換性のみのために用意されています。

  • setObjectメソッドを使用して各国語文字セットにアクセスすることもできますが、setObjectメソッドを使用する場合、ターゲット・データ型をTypes.NCHARTypes.NCLOBTypes.NVARCHARまたはTypes.LONGNVARCHARとして設定する必要があります。

ノート:

Oracle Databaseでは、SQL文字列はデータベース文字セットに変換されます。そのため、次のことを覚えておく必要があります。

  • Oracle Database 10gリリース1(10.1)以前のリリースでは、JDBCドライバは、データベース文字セットで表示できないUnicode文字を含むNCHARリテラル(n'...')をサポートしていません。データベース文字セットで表示できないUnicode文字はすべて破損します。

  • Oracle Database 10gリリース2(10.2)のJDBCドライバがOracle Database 10gリリース2(10.2)のデータベース・サーバーに接続されている場合、NCHARリテラル(n'...')はすべてUnicodeリテラル(u'...')に変換され、ASCII以外の文字はすべて対応するUnicodeエスケープ・シーケンスに変換されます。この変換は、データ破損を防ぐために自動的に実行されます。

  • Oracle Database 10gリリース2(10.2)のJDBCドライバがOracle Database 10gリリース1(10.1)以前のデータベース・サーバーに接続されている場合、NCHARリテラル(n'...')は変換されないため、データベース文字セットで表示できない文字はすべて破損します。

19.3 JDK 6での各国語文字セット用の新しいメソッド

JDBC 4.0では、各国語文字セット型にアクセスするために、次の4つの追加SQL型のサポートが導入されています。

  • NCHAR

  • NVARCHAR

  • LONGNVARCHAR

  • NCLOB

これらの型は、各国語文字セットを使用して値がエンコードされる点を除き、CHARVARCHARLONGVARCHARおよびCLOB型に類似しています。JDBCの仕様では、Stringクラスを使用してNCHARNVARCHARおよびLONGNVARCHARデータを表し、NClobクラスを使用してNCLOB値を表します。

各国語の文字値を取得するには、アプリケーションから次のいずれかのメソッドをコールします。

  • getNString

  • getNClob

  • getNCharacterStream

  • getObject

ノート:

NClobClobを実装しているため、getClobメソッドを使用して、NClobオブジェクトを戻します。

各国語キャラクタ・タイプのパラメータ・マーカーの値を指定するには、アプリケーションから次のいずれかのメソッドをコールします。

  • setNString

  • setNCharacterStream

  • setNClob

  • setObject

ノート:

setFormOfUseメソッドを使用して、JDK 6の各国語キャラクタ値を指定できます。しかし、このメソッドは今後のリリースで非推奨になるため、利用はお薦めしません。この項で説明したメソッドを使用することをお薦めします。

関連項目:

setObjectメソッドが使用される場合、ターゲット・データ型をTypes.NCHARTypes.NCLOBTypes.NVARCHARまたはTypes.LONGNVARCHARとして設定する必要があります。