IBM Support

[Db2] ニックネームを照会するとデータが切リ捨てられることがある

Question & Answer


Question

連合データベースで、ニックネームを照会すると、列に含まれるデータの一部が切り捨てられることがあります。 これはなぜでしょう。対処方法を教えてください。

Cause

連合データベースのコード・ページと、ソース・データベースのコード・ページが異なる場合、文字コードの変換によってエンコード後のバイト長が異なることがあります。
例えば、ソース・データベースがシフト JIS (CCSID 943) で、連合データベースが UTF-8 (CCSID 1208) の場合、ひらがなや漢字一文字はソース・データベースで 2 バイトですが、連合データベースでは 3 バイトになります。

このケースで、ソース表とニックネームの列定義を同じにすると、CHAR(10) と定義された列にソース表には 5 文字格納できますが、ニックネームには 3 文字しか割り当てられません。

Answer

ソース・データベースと、連合データベースのコード・ページが異なる場合、コード変換による文字列長の増加に対応して、ニックネームの列定義を変更してください。
たとえば、ソース・データベースがシフト JIS (CCSID 943 ) で連合データベースが UTF-8 (CCSID 1208) の場合、半角カナはそれぞれ 1 バイト、3 バイトでエンコードされるため、データに半角カナを含む場合は、ニックネームの列長をソース表の 3 倍に定義する必要があります。半角カナを含まない場合でも、ひらがなや漢字を含む場合は 1.5 倍に定義する必要があります。

ニックネームの列属性は ALTER NICKNAME ステートメントで変更できます。たとえば、ソース表で CHAR(10) と定義された C1 列を CHAR(30) に変更するには以下のようなステートメントを実行します。
db2 "alter nickname <nickname> alter column C1 local type char(30)"
Db2 11.1.4.6 および 11.5.6 以降、CHAR(10) から CHAR(30) のような変更は CREATE NICKNAME 時に自動的に行われます。ただし変更後の列長が型の制限を超える場合は CREATE NICKNAME が SQL0901N で失敗することがあります。詳細は以下のページを参照してください。
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkvAAE","label":"Federation"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"10.1.0;10.5.0;11.1.0;11.5.0;9.7.0"}]

Document Information

Modified date:
30 August 2023

UID

swg21966249