IBM Support

[Db2] データベース接続時に SQL0332N を防ぐ方法

Question & Answer


Question

英語環境のターミナルから、シフト JIS (IBM-943) のデータベースに接続すると SQL0332N で接続できません。
接続するにはどうすればよいでしょうか。

Cause

Db2 アプリケーションとデータベースは互換性のあるコード・ページでのみ接続可能です。
たとえば、シフト JIS (IBM-943) と互換性があるコード・ページは、以下のページのグループ D-1 と N-1 にリストされています。
また、Unix/Linux で Db2 アプリケーションはデフォルトで LC_CTYPE をもとにコード・ページを決定します。
たとえば、AIX で LANG=Ja_JP  (LC_CTYPE=Ja_JP) であれば、アプリケーション・コード・ページは 943 になります。
表 35. 日本、テリトリー ID: JP

コード・ページ グループ コード・セット ロケール オペレーティング・システム
-------------- -------- -------------- -------- --------------------------
943            D-1      IBM-943        Ja_JP    AIX
ここで LANG=C (LC_CTYPE=C) を設定すると、アプリケーション・コード・ページは 819 (グループ S-1) になり、データベースの 943 (グループ D-1) と互換性がないために、接続要求は SQL0332N で失敗します。
このとき、サーバーの db2diag.log には以下のようなログが記録されます。
2019-01-31-01.55.45.569842-300 I20997A660           LEVEL: Severe
PID     : 24183112             TID : 60882          PROC : db2sysc
INSTANCE: db2inst1             NODE : 000           DB   : DB943
APPHDL  : 0-2759               APPID: *LOCAL.db2inst1.190131065655
AUTHID  : APPUSER1             HOSTNAME: db2srv1
EDUID   : 60882                EDUNAME: db2agent (DB943)
FUNCTION: DB2 UDB, base sys utilities, sqeApplication::SetupCodePageInfo, probe:200
RETCODE : ZRC=0x800F005B=-2146500517=SQLO_NOTABLE "No conversion table exists"
          DIA8102C Conversion table not loaded. Source code page "819", Target
          code page "897", method "", handle "".

2019-01-31-01.55.45.570588-300 I21658A543           LEVEL: Severe
PID     : 24183112             TID : 60882          PROC : db2sysc
INSTANCE: db2inst1             NODE : 000           DB   : DB943
APPHDL  : 0-2759               APPID: *LOCAL.db2inst1.190131065655
AUTHID  : APPUSER1             HOSTNAME: db2srv1
EDUID   : 60882                EDUNAME: db2agent (DB943)
FUNCTION: DB2 UDB, base sys utilities, sqeApplication::AppStartUsing, probe:20
DATA #1 : Hexdump, 4 bytes
0x0700000068FFC484 : FFFF FEB4                                  ....

2019-01-31-01.55.46.324848-300 E23284A832           LEVEL: Error
PID     : 24183112             TID : 60882          PROC : db2sysc
INSTANCE: db2inst1             NODE : 000           DB   : DB943
APPHDL  : 0-2759               APPID: *LOCAL.db2inst1.190131065655
AUTHID  : APPUSER1             HOSTNAME: db2srv1
EDUID   : 60882                EDUNAME: db2agent (idle)
FUNCTION: DB2 UDB, DRDA Application Server, sqljsPostProcessingConnectAttach, probe:649
MESSAGE : DIA5000C A DRDA AS token "RECOVERABLE" was detected.  The diagnostic
          data returned is (SRVDGN): "FUNCTION ID = 0013 , PROBE POINT = 0649 ,
          TRACE POINT = 0150 , SUBCODE1 = FFFFFFFF8005006D, SUBCODE2 =
          FFFFFFFFFFFFFEB4, SUBCODE3 = 0000000000000000, ERROR MSG = SQLAM:
          CONNECT failed. CCSID specified on ACCRDB not supported".

Answer

Db2 のアプリケーション・コード・ページは DB2CODEPAGE 変数で上書きできます。
このため、アプリケーションが参照する DB2CODEPAGE 環境変数を、データベースと互換性のあるコード・ページに設定することで接続できるようになります。
ただし、DB2CODEPAGE 環境変数を OS のターミナルと互換性のないものに設定すると、ターミナル上で文字化けが発生します。たとえば、ターミナルがシフト JIS にもかかわらず、DB2CODEPAGE を 954 (EUC-JP) に設定すると、接続はできますが出力結果は文字化けします。
設定例
  1. コード・セットがシフト JIS (IBM-943) のデータベースを作成します。
    $ db2 create db db943 using codeset IBM-943 territory JP
    DB20000I  The CREATE DATABASE command completed successfully.
  2. LANG を C に設定してデータベースに接続すると SQL0332N で失敗します。
    $ export LANG=C
    $ db2 terminate
    $ db2 connect to db943
    SQL0332N  Character conversion from the source code page "819" to the target
    code page "UNKNOWN" is not supported.  SQLSTATE=57017
  3. DB2CODEPAGE に互換性のあるコード・ページを設定すると、terminate で CLP を再起動してから接続できます。
    $ export DB2CODEPAGE=943
    $ db2 terminate
    DB20000I  The TERMINATE command completed successfully.
    
    $ db2 connect to db943
    
    Database Connection Information
    
     Database server = DB2/AIX64 11.1.4.4
     SQL authorization ID   = DB2INST1
     Local database alias   = DB943
    
運用上の注意点
  • DB2CODEPAGE はデータベース・サーバーでなく Db2 アプリケーションが参照する変数です。アプリケーションの環境変数に設定し、アプリケーションが再起動してその環境変数を参照して有効になります。
  • 不適切な DB2CODEPAGE 変数の使用は文字化けやデータ破壊の原因になるため、結果を予測できない場合は使用しないでください。
  • 不明なアプリケーションが継続的に互換性のないコードページで接続を試行しているために db2diag.log に定期的に DIA8102C が記録される場合、db2pdcfg を利用して不明なアプリケーションの接続元やアプリケーション名を特定できます。
    1. データベース・サーバーにインスタンス・オーナーでログインします。
    2. DIA8102C を記録すると db2cos を実行するように db2pdcfg で設定します。
      注:以下の設定では 5 回 DIA8102C を記録すると db2pdcfg の設定は解除されます。
      db2pdcfg -catch diagstr=DIA8102C count=5
    3. db2diag.log に  DIA8102C が記録されると DIAGPATH に <db2sysc_pid>.<edu_id>.<node_id>.db2pd.<db_name>.txt が生成され、これに含まれる db2pd -agent にアプリケーション・プログラム名が記録されています。
    4. (オプション) 設定が不要になった場合は db2pdcfg で設定を解除します。
      db2pdcfg -catch clear
関連情報
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと 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":"a8m500000008PlRAAU","label":"Codepage"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"All Versions"}]

Document Information

Modified date:
15 August 2023

UID

ibm10869852