コード・ポイント・サイズが非互換の場合の拡張ニックネーム列
コード・ポイント・サイズは、特定のエンコードで抽象文字をエンコードするために使用されるバイト数です。 フェデレーテッド・データベースとリモート・データ・ソースの間でコード・ポイント・サイズが異なる場合は、更新の失敗だけでなく、切り捨てられたデータが返されたり挿入されたりする可能性があります。 これらの結果が生じるかどうかは、リモート・サーバーで使用されるエンコード方式によって異なります。
コード・ポイント・サイズの説明
フェデレーテッド 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
例
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
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 などのエラーが報告されます。