データ・エンコードの基礎

ほとんどの Db2 for z/OS® サブシステムは、複数のエンコーディングスキームからのデータを処理したり、異なるアプリケーションが互いに通信しなければならない分散環境で動作します。 こうした環境では、コード・ページと CCSID の基礎を理解すると、特定のタイプのパフォーマンス上の問題や、それよりもさらに悪いデータ破損を回避するのに役立ちます。

コード・ページおよび CCSID とは

コード・ページ は、それぞれの 16 進数が表わす文字をコンピューターに示すマップです。 同様の別の用語は、CCSID です。 CCSID は、特定時点におけるコード・ページの実装を識別する数値です。 これらの用語は同じ意味で使用されることもありますが、実際には異なります。 これらの用語やその違いについてよくわからない場合は、「コードページとCCSID」 をお読みください。

Db2 for z/OS コードページ番号ではなく、CCSID値を使用します。 あるデータのエンコード値を示すには、CCSID を指定します。 Db2 このCCSID値を使用してデータを解釈します。 正しい CCSID を指定しないと、受信側のプログラムによってデータが間違って解釈されたり破損したりする恐れがあります。

各 CCSID は、1 つのコード化スキームに属します。 主なコード化スキームは、EBCDIC、ASCII、および Unicode です。 エンコーディングスキームとCCSIDとエンコーディングスキームの関係についてさらに詳しく知りたい場合は、「エンコーディングスキーム」 を参照してください。

異なるシステムまたはアプリケーション間でデータが渡される際に、ある CCSID から別の CCSID に変換する必要がある場合があります。 このプロセスは、文字変換 と呼ばれます。 場合によっては、文字変換は同じシステム内で生じることもあります。 文字変換はパフォーマンスを低下させる可能性があるため、可能な限り文字変換を回避するのが理想的です。

Db2 サブシステムが使用しているCCSIDはどれですか?

Db2 for z/OS サブシステムには、ASCII、EBCDIC、Unicodeの各エンコード方式に対応する3つのデフォルトのCCSIDセットがあります。 システム管理者は、ASCII CCSID セットと EBCDIC CCSID セットの値を設定できます。 Unicode CCSID セットは事前定義されているので、変更できません。

また各サブシステムには 2 つのデフォルト・コード化スキームがあり、1 つはサブシステム用でもう 1 つはアプリケーション用です。 サブシステムの値は、 Db2 オブジェクトのデフォルトのエンコード方式を決定します。 アプリケーションの値によって、アプリケーションから Db2 に渡されるデータのデフォルトのエンコード方式が決まります。

既定のCCSIDとエンコードスキームの値について、その指定場所を含め、さらに詳しい情報が必要な場合は、「サブシステムのCCSIDとエンコードスキーム 」を参照してください。

サブシステムに定義されている値を決定するには、システムプログラマーに問い合わせるか、または 「現在のサブシステムの CCSID およびエンコーディングスキームの値の決定」 の手順に従ってください。

CCSID とコード化スキームのデフォルト値は、以下の方法で影響を及ぼします。

  • ユーザーがデータベース・オブジェクトを作成する方法に影響を与える可能性があります。 次の例を考慮してください。
    • CREATE TABLE ステートメントで表を作成し、CCSID EBCDIC を指定します。 Db2 そのテーブルをデフォルトのEBCDIC CCSID値で定義します。 ご使用のサブシステムでの値が 500 であるとします。 Db2 そのテーブル内のすべてのデータを、CCSID 500でエンコードして格納します。
    • 表を作成し、CCSID を定義しません。 この場合、 Db2 はデフォルトのサブシステムエンコーディングスキームを使用します。 その値が EBCDIC でデフォルトの EBCDIC CCSID が 500 の場合、表は CCSID 500 を使用して再作成されます。
    データが CCSID 500 でエンコードされている場合、上記のどちらの例でも正常に作動します。 しかし、データが CCSID 857 などの別の CCSID でエンコードされている場合、これらの例はどちらもデータの破損につながります。 Db2 は、データを解釈する際に誤ったコードページを使用しています。
  • これらは、変数を Db2 に渡すアプリケーションの書き方に影響します。 アプリケーションがデータを Db2 に渡すが、 Db2 に渡すデータのCCSIDを通知しないと仮定します。 Db2 次に、データがサブシステムのデフォルトのアプリケーションエンコーディングスキームにあると仮定します。 また、その値が EBCDIC であるとすると、この場合にはデフォルトの EBCDIC CCSID が 37 です。 Db2 CCSID 37でエンコードされていると解釈してデータを渡している。 データが CCSID 37 でエンコードされている場合には、このシナリオは正常に作動します。 しかし、データがCCSID 860などの別のCCSIDでエンコードされている場合、 Db2 はアプリケーションからのこのデータを誤って解釈し、データが破損します。

他のデータ・ソースが使用している CCSID

データ・ソースすべてでどの CCSID が使用されているかを把握するのは、データが確実に正しく解釈され、最小の変換で済むようにするためには重要なことです。

表を CCSID 500 を使用して作成した例について考慮してください。 データを表にロードしていますが、ロードしているデータは CCSID 37 でエンコードされているとします。 LOAD ユーティリティーを使用して、入力データに対して CCSID 37 を指定すると想定します。 データは CCSID 37 から CCSID 500 に変換されなければなりません。 これらの CCSID は似ていますが、一部の文字は変換する必要があります。 変換する必要がある文字の数が多ければ多いほど、パフォーマンスに与える影響も大きくなります。

次に、アプリケーションが Db2 に渡すデータのCCSIDを指定していない場合を考えてみましょう。 再び、デフォルトのアプリケーション・コード化スキームが EBCDIC であるとすると、デフォルトの EBCDIC CCSID は 37 です。 Db2 受信したデータがCCSID 37であると仮定します。 しかし、 Db2 に渡しているデータが、実際には別のCCSIDであるとします。 例えば、CCSID 281 でエンコードされている日本語文字を渡すとします。 Db2 CCSID 37でエンコードされているかのようにデータを読み取っているため、データが破損しています。

もう少し複雑な例を考えましょう。 渡しているデータが CCSID 1140 であるとします。 CCSID 37 と CCSID 1140 との間で違いがあるのは 1 つのコード・ポイントだけで、それはコード・ポイント X'9F' の文字です。 Db2 に送信されるデータにこの文字が含まれていない場合、問題に気づかない可能性もあります。 しかし、ある日、この文字が Db2 に渡されたとします。 アプリケーションは € を渡しますが、 Db2 はそれを CCSID 37 を使用して解釈します。これにより、データには破損した文字が 1 つ含まれるようになり、エラーの検出に時間がかかる場合があります。

こうした例は、作業対象のデータすべての CCSID を把握していることの重要性を示しています。 次のリソースは、使用しているデータ・ソースの CCSID 値を見つけるのに役立ちます。

CCSID を指定する場所

オブジェクトとアプリケーションの CCSID は次のように指定できます。

  • オブジェクトの場合、作成時に CCSID を指定します。 詳細は 「オブジェクトCCSIDの指定 」を参照してください。
  • Db2 for z/OS アプリケーションの場合、プログラムのソースコード用と変数用のCCSIDを指定することができます。 ソースコードの CCSID を指定する方法は、プリコンパイラである Db2 またはコプロセッサである Db2 のいずれを使用するか、また使用する言語によって異なります。 アプリケーション・データ (ホスト変数とパラメーター・マーカー) の場合、通常は ENCODING バインド・オプションを使用します。 プロセスおよび利用可能なオプションの詳細については、「アプリケーションの CCSID の指定」 を参照してください。

Unicode とは

Unicode は、すべての文字が含まれる 1 つの大きなコード・ページと考えることができます。 詳細については、「Unicode とUnicode標準 」を参照してください。

Db2 for z/OS がサポートしているUnicodeのフォーマットは、 UTF-8 と UTF-16 の2種類です。 これらのフォーマットについては、UTF および UTF-8 または UTF-16 としてデータを保存するかどうかを決定するで説明されています。

他の学習リソース

CCSID、Unicode、国際データについての包括的な説明(言語の並べ替え順序を指定する方法や、文化的に正しい大文字と小文字の変換を実行する方法など)については、 Db2 for z/OS の「国際データと文字変換 」を参照してください。

Unicode についての詳細なトレーニングについては、以下のリソースを使用してください。