1. 導入:なぜCHAR属性が重要なのか
メインフレームでの開発において、データは「決まった長さ(固定長)」であることが大前提です。特に事務計算では、レコードのレイアウトが1バイトでもずれると、後続のプログラムやデータベースへの書き込みでエラーが発生してしまいます。CHARACTER(CHAR)属性は、この固定長というルールを守るために最も基本的な役割を果たしており、正しく理解することで「ファイルレイアウトの崩れ」という致命的なミスを防ぐことができます。
2. 基礎知識:CHAR属性とは何か
CHAR属性は、固定長の文字列を保持するためのデータ型です。Javaなどの言語のように、可変長(中身の長さに合わせてメモリが変わる)ではありません。指定した長さ(バイト数)が常に確保され、文字数が足りない場合は、自動的に右側に「空白(スペース)」が詰められます。
メインフレームでは、この空白はEBCDICコードの「40(16進数)」として扱われます。この「勝手に空白が入る」という仕様は、一見便利ですが、他システムとの連携時には非常に重要なポイントとなります。
3. 実装と解決策:固定長を維持する意識
CHAR属性を扱う際の最大の注意点は、「意図しない空白混入」と「桁あふれ」です。例えば、CHAR(10)の変数に「IBM」という3文字を入れた場合、内部的には「IBM 」と自動的に変換されます。この「空白を含めて10バイト」という性質を計算に入れないと、文字列の連結や比較で予期せぬ結果を招きます。
移行や連携の際は、送受信するデータのバイト数が、定義したCHARの長さと完全に一致しているかを確認する癖をつけましょう。
4. サンプルプログラム
以下は、PL/I言語を想定したCHAR属性の基本的な使用例です。
/ プログラム名: CHAR_TEST /
TEST_PROC: PROCEDURE OPTIONS(MAIN);
/ 20バイトの固定長文字列を定義 /
DCL USER_NAME CHAR(20);
DCL MSG_AREA CHAR(50);
/ 文字列を代入 /
/ 3文字代入しても、残りの17文字は自動的に空白(X’40’)で埋められます /
USER_NAME = ‘IBM’;
/ 文字列を連結して出力用の変数へ代入 /
/ TRIM関数を使わない場合、USER_NAMEの後ろの空白もそのまま結合される点に注意 /
MSG_AREA = ‘ユーザー名:’ || USER_NAME || ‘様’;
/ ここでMSG_AREAの中身を確認すると、’IBM’の後に空白が入り、 /
/ ‘ユーザー名:IBM 様’ のような形になります /
PUT SKIP LIST(MSG_AREA);
END TEST_PROC;
5. 応用・注意点:現場で陥りやすいバグ
現場でよくあるミスは、JavaやC#などの可変長文字列の感覚で「文字列比較」を行ってしまうことです。
例えば、CHAR(5)の変数に「A」と入れた場合、それは「A 」となります。これを「A」という文字列と比較しようとすると、後続の空白の有無で「不一致」と判定されることがあります。
比較を行う際は、TRIM関数を使って空白を除去してから比較するか、あるいはあらかじめ定義した固定長に合わせて空白を付与した値と比較するようにしてください。この「固定長である」という意識を常に持つことが、メインフレーム技術者への第一歩です。

コメント