実行環境

80. CCSID は、どのようにして決まるのか

ここでは、さらに現実的に運用するときに CCSID がどのようにして決定されていくのかを解説する。
まず実行ジョブの CCSID は システム値 QCCSID が 65535 ,つまり無の状態であれば
システム値 QCNTRYID (国コード)によって決まる。
QCNTRYIDJP (日本) の場合、QCCSID が 65535 であれば 実行ジョブの CCSID は 5026 となる。

CCSIDの決まり方a

次に システム値 QCCSID が 65535 以外の値であれば、実行ジョブの CCSID は
システム値 QCCSID と同じ値になる。
例えば QCCSID が 5035 であれば 実行ジョブの CCSID も 5035 となる。
QCCSID が 1399 であれば 実行ジョブの CCSID も 1399 となる。

CCSIDの決まり方b

【QLOCALE の誤解】

ある大手の二次特約店は QCCSID を 5026 に設定する場合、システム値 QLOCALE も変更している。
QCCSID を 5026 に変更して QLOCALE も /QSYS.LIB/JA_5026.LOCALE のように5026 に変更してしまう。
CCSID と QLOCALE は何の関係もないので、このような変更は厳に謹んでもらいたい。
QLOCALE の正しい設定値は *NONE または /QSYS.LIB/JA_5035.LOCALE である。

【ファイルのCCSIDはどのようにして決まるか】

ファイルの CCSID を決定するのはファイルを作成する基となるソース・ファイルのCCSID である。
ソース・ファイルを作成するときには、

CRTSRCPF FILE(MYSRCLIB/QDDSSRC) IGCDTA(*YES) AUT(*ALL)

のようにして作成するが、CRTSRCPF コマンドには CCSID キー・ワードがあり
何も指定しないと省略時の値は CCSID(*JOB)であり、

CRTSRCPF FILE(MYSRCLIB/QDDSSRC) IGCDTA(*YES) CCSID(*JOB) AUT(*ALL)

として指定したのと同じことになる。
ここで CCSID(*JOB) とは CRTSRCPF を実行しているジョブの「省略時のCCSID」のことである。
DSPJOB を実行すると「省略時のCCSID」は次のように表示される。

省略時のCCSID

CRTSRCPF で CCSID(*JOB) または何も指定しないでソース・ファイルを作成した場合は
ソース・ファイルの CCSID は ジョブの省略時のCCSIDとなる。

次に実際のファイルを CRTPF や CRTLF コマンドによって作成するものとする。
このとき CRTPF や CRTLF にも

コード化文字セット ID (CCSID) (*JOB)

パラメータはあるが、ソース・ファイルから物理ファイルや論理ファイルを作成するときは
CCSID パラメータを *JOB ではなく明示的に変更して指定することはできない。
CCSID パラメータを指定することができるのは 「DDS がない場合のレコード長(LEN)」パラメータを
指定した場合のみである。
つまり DDSソースを指定した作成する場合の作成されるファイルのCCSID はソース・ファイルの
CCSID に一致するのである。

ファイルのCCSID は作成される基になるソース・ファイルのCCSID によって決まる

ということになる。
ここで、そうであれば CRTPF や CRTLF のコード化文字セット ID (CCSID) (*JOB)
省略時の値が「*JOB」と記載されているのは何故だろうか ?
ソース・ファイルのCCSID に依存しているのに、何故 *JOB となっているのだろうか ?
これはソース・ファイルの CCSID が 65535 である場合、すなわち CCSID が無の状態のときには
*JOB としてジョブの省略時のCCSID が採用されることを意味している。
従ってソース・ファイルの CCSID を 65535 として作成しておけば、実行ジョブのCCSID によって
任意のCCSID のファイルを作成することができる。
将来、社内のデータ・ベースの CCSID が変更されるかも知れない可能性を考慮するならば
DDS ソースのソース・ファイルは CCSID 655535 で作成しておけば、どのような CCSID にでも
対応することができる。
良く雑誌やネットのサンプルの解説で 「CCSID 5035 でソース・ファイルを作成しておきます」と
いうような解説があるが、これも筆者が CCSID を正しく理解できていないためにこのような
解説文となってしまっている。
CCSID を変えるデータ・ベースを作成したのであれば CCSID は 65535 にしておいて
作成を実行するジョブの CCSID を目的の CCSID にセットして(CHGJOB CCSID)作成するように
すべきである。
CCSID 65535 のソース・ファイルであれば、ひとつのDDSソースから状況や事情に応じて
どのような CCSID のファイルでも作成することができるのである。

国際言語対応や Unicode 対応を意識するのであれば、
DDSソース・ファイルは CCSID 65535 で作成すべきである。

【ファイルのCCSID とは】

ここで CCSID を再認識する意味においてファイルに関連づけられた CCSID の意味について
もう一度、解説を加えておくことにする。

ファイルの CCSID とは、そのファイルに保管されているデータのHEXコードを
どのCCSID として読み取るべきかを示す記号である。

例えば ある文字が HEX = 0x81 であったとする。
この 0x81 は、この文字が保管されているファイルの CCSID が 5026 であれば
0x81 は半角カナの「ア」を意味するし、ファイルのCCSID が 5035 であれば
0x81 は英小文字の「a」を意味する。
このように CCSID とは、データ・ベースの HEX コードを正しく読み取るための
指針となる識別記号のことである。
言い方を変えれば データ・ベース 5026 のファイルは ジョブのCCSID が 5026 環境で
読み取ると初めて正しく表示されるデータ・ペースであることを意味している。