コード・ポイント・サイズが非互換の場合の拡張ニックネーム列

コード・ポイント・サイズは、特定のエンコードで抽象文字をエンコードするために使用されるバイト数です。 フェデレーテッド・データベースとリモート・データ・ソースの間でコード・ポイント・サイズが異なる場合は、更新の失敗だけでなく、切り捨てられたデータが返されたり挿入されたりする可能性があります。 これらの結果が生じるかどうかは、リモート・サーバーで使用されるエンコード方式によって異なります。

コード・ポイント・サイズの説明

フェデレーテッド Db2 環境では、リモート・データ・ソースの列は、フェデレーテッド・データベースの対応する列と同じコード・ポイント・サイズでなければなりません。 これらの値が一致しない場合、データが切り捨てられ、エラーが生成される可能性があります。

例えば、2 バイト文字セット (DBCS) は、すべての文字またはグラフィック文字が 2 バイトでエンコードされるエンコード方式です。 リモート文字ストリングが DBCS を使用してエンコードされ、関連するフェデレーテッド・データベースが UTF-8 エンコードを使用する場合、各 2 バイト文字はフェデレーテッド・データベース上で最大 4 バイトのシーケンスとして UTF-8 で表されます。 フェデレーテッド・データベースのニックネーム列はリモート表の列と同じ長さであるため、ニックネーム列はリモート・データ・ソースからフェッチされた完全なストリングを保持できません。 結果は切り捨てられたデータ・ストリングです。

自動拡張ニックネーム列サイズ

Db2® 11.5.7 以降では、COLUMN_LENGTH_AUTO_VARIATION オプションを設定して、ニックネーム列の長さを自動的に変更するかどうかを制御できます。 デフォルトでは、COLUMN_LENGTH_AUTO_VARIATION が設定されていない場合、ニックネームの長さは変換規則に従って自動的に拡張されます。 詳しくは、 フェデレーテッド・データベースの COLUMN_LENGTH_AUTO_VARIATION オプションの設定を参照してください。

コード・ポイント・サイズが異なる場合に切り捨てられたデータを返すか挿入するデータ・ソース:
以下のデータ・ソースに対して照会を実行すると、切り捨てられた結果、読めない結果、またはコード・ポイント・サイズに互換性がない場合は失敗が返されます。
  • BigSQL
  • SAP Sybase
  • Teradata
  • Informix
  • MSSQL
  • ODBC
  • JDBC
切り捨てられたデータがぶら下がり文字で終了する場合、残りのバイトはブランクで埋められます。
注: 場合によっては、ニックネーム列の長さを手動で変更することで、結果セットの切り捨てを回避できます。
コード・ポイント・サイズが異なる場合に自動的にサイズ変更するデータ・ソース:
リモート・サーバーのコード・ポイント・サイズがフェデレーテッド・データベースと異なる場合、以下のデータ・ソースについては、切り捨てられた結果は返されません。
  • DRDA
  • Oracle
代わりに、Nickname 列は自動的に大きくなり、リモート・データ・ソースから完成した列データを受け取ります。 増加した列の長さは、文字結果の実際の長さ (バイト単位) を超える可能性があるため、余分のバイトはスペースで埋められます。 詳しくは、 フェデレーテッド・データベースの COLUMN_LENGTH_AUTO_VARIATION オプションの設定を参照してください。

以下の例は、コード・セット GBK2312を持つリモート Oracle Server 内の表の列の長さを示しています。
Name                                    Nullable? Type
----------------------------------------- -------- ----------------------------
NAME						               CHAR(12)
ADDRESS					                   VARCHAR2(12)
HOBBY					                     NCHAR(12)
SKILL					                     NVARCHAR2(12)
フェデレーテッド・データベースのコード・ページは UTF-8 エンコードを使用するため、 Oracle 表の CHAR および VARCHAR データ・タイプの列の長さに 3 を乗算します (12 x 3 = 36)。
Column name            schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
NAME                            SYSIBM    CHARACTER                   36     0 Yes
ADDRESS                         SYSIBM    VARCHAR                     36     0 Yes
HOBBY                           SYSIBM    GRAPHIC                     12     0 Yes
SKILL                           SYSIBM    VARGRAPHIC                  12     0 Yes
以下の例は、フェデレーテッド・データベース内の拡張ニックネーム CHAR 列 name を照会するコマンド構文と出力を示しています。 結果の末尾にブランク文字が追加されることに注意してください。
db2 "select hex(name) from nk1"
2
------------------------------------------------------------------------
E5BCA0E4B889E69D8EE59B9BE78E8BE4BA94202020202020202020202020202020202020
以下の例は、フェデレーテッド・データベース内の拡張ニックネーム VARCHAR 列 address の照会のコマンド構文と出力を示しています。 追加のスペースは追加されないことに注意してください。
db2 "select hex(address) from nk1"
2
------------------------------------------------------------------------
E4B8ADE585B3E69D91E58D81E58FB7E9878C

使用上の注意

  • 拡張された列サイズは、INSERT/UPDATE ステートメントには影響しません。 挿入されたデータまたは付加されたブランクは切り捨てられませんが、ブランクを付加して CHAR 列に挿入されます。 ニックネームから照会されると、ブランクが拡張されます。
  • パススルー照会は、切り捨てられずに完全な結果セットを返します。
  • 3 部構成の名前照会は、切り捨てられずに完全な結果セットを返します。 これは、ニックネームからの照会と同じように機能します。
  • リモート・データ・ソースの許容される長さを超えるニックネームからデータをインポートまたは挿入すると、エラーになります。

制約事項

  • ニックネームへのエクスポート操作では追加のブランクが取得され、それに応じてストリング関数パラメーターが拡張されます。
    例えば、リモート列の長さが 12 で、ニックネームの作成時に列サイズが 3 倍拡張される場合、RPAD 関数の長さパラメーターはそれに応じて拡張されます。
    (RPAD(Q1.ADDRESS, 36, ' ') = ' ') 
    ニックネーム列のサイズを調整して、ブランクが付加されないようにすると、予期しない切り捨てが行われる可能性があります。
  • Db2 11.5.7 以降では、文字ストリング変換の結果がリモート・データ・ソース列のサイズより大きいバイト数になった場合、挿入または更新は失敗します。 場合によっては、フェデレーテッド・データベースのコード・ポイント・サイズがリモート・データ・ソースより小さいことがあります。 例えば、リモート・データ・ソースが UTF8の場合、1 文字が 3 バイトを占めます。フェデレーテッド・データベースが DBCS の場合、1 文字が 2 バイトを占めるため、フェデレーテッド・データベースでは 10 文字が 20 バイト、リモート・データ・ソースでは 30 バイトを占めます。 リモート表の列の最大長はニックネーム (20 バイト) と同じであるため、 SQL1822N などのエラーが報告されます。