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オブジェクトまたはコレクション型のデータ・メンバーとして取得または挿入されない
CHAR
、VARCHAR
、LONGVARCHAR
またはCLOB
データ用のOracle文字セット -
文字セット
US7ASCII
、WE8DEC
、WE8ISO8859P1
、WE8MSWIN1252
および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がカスタム文字セットをサポートするためには、次の操作を実行する必要があります。
-
カスタム文字セットの作成プロセスで
.nlt
および.nlb
ファイルを作成した後で、次のコマンドを使用して、新たに作成した文字セットとlx0boot.nlt
ファイルのために.glb
ファイルを作成します。java -classpath $ORACLE_HOME/jlib/orai18n.jar:$ORACLE_HOME/lib/xmlparserv2.jar Ginstall -[add | a] <NLT_file_name>
-
カスタム文字セットを使用してデータベースに接続するJDBCコードを実行する場合は、生成したファイルと
$ORACLE_HOME/jlib/orai18n-mappings.jar
をclasspath
環境変数に追加します。
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
を接続プロパティとして指定してNCHAR
、NVARCHAR2
または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.NCHAR
、Types.NCLOB
、Types.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
これらの型は、各国語文字セットを使用して値がエンコードされる点を除き、CHAR
、VARCHAR
、LONGVARCHAR
およびCLOB
型に類似しています。JDBCの仕様では、String
クラスを使用してNCHAR
、NVARCHAR
およびLONGNVARCHAR
データを表し、NClob
クラスを使用してNCLOB
値を表します。
各国語の文字値を取得するには、アプリケーションから次のいずれかのメソッドをコールします。
-
getNString
-
getNClob
-
getNCharacterStream
-
getObject
ノート:
NClob
がClob
を実装しているため、getClob
メソッドを使用して、NClob
オブジェクトを戻します。
各国語キャラクタ・タイプのパラメータ・マーカーの値を指定するには、アプリケーションから次のいずれかのメソッドをコールします。
-
setNString
-
setNCharacterStream
-
setNClob
-
setObject
ノート:
setFormOfUse
メソッドを使用して、JDK 6の各国語キャラクタ値を指定できます。しかし、このメソッドは今後のリリースで非推奨になるため、利用はお薦めしません。この項で説明したメソッドを使用することをお薦めします。
関連項目:
setObject
メソッドが使用される場合、ターゲット・データ型をTypes.NCHAR
、Types.NCLOB
、Types.NVARCHAR
またはTypes.LONGNVARCHAR
として設定する必要があります。