アプリケーション開発の手引き

付録 E. EBCDIC 2 進照合のシミュレート

DB2 では、ユーザー定義の照合順序にしたがって文字ストリングを照合できます。この機能は、EBCDIC 2 進照合のシミュレートに使えます。

EBCDIC 照合をシミュレートする方法の一例として、コード・ページ 850 の ASCII データベースを作成し、コード・ページ 500 の EBCDIC データベースに実際にデータが存在することを前提として文字ストリングを照合するとしましょう。コード・ページ 500 の定義については図 26、コード・ページ 850 の定義については図 27 を参照してください。

EBCDIC コード・ページ 500 のデータベースにある 4 つの文字を相対的に照合することについて考えます。これらの文字は次のように 2 進で照合されています。

文字
コード・ページ 500 コード・ポイント
'a'
X'81'
'b'
X'82'
'A'
X'C1'
'B'
X'C2'

コード・ページ 500 の 2 進照合順序 (希望する順序) は、次のとおりです。

    'a' < 'b' < 'A' < 'B'

データベースを ASCII コード・ページ 850 で作成する場合、2 進照合の結果は以下のようになります。

文字
コード・ページ 850 コード・ポイント
'a'
X'61'
'b'
X'62'
'A'
X'41'
'B'
X'42'

コード・ページ 850 の 2 進照合 (希望する順序ではない) は、次のとおりです。

    'A' < 'B' < 'a' < 'b'

希望する順序を実現するには、ユーザー定義照合順序でデータベースを作成する必要があります。 sqle850a.h インクルード・ファイルの DB2 には、まさにこの目的のために照合順序のサンプルが付属しています。 sqle850a.h の内容は、図 25 に示されています。

図 25. ユーザー定義の照合順序 - sqle_850_500

#ifndef SQL_H_SQLE850A
#define SQL_H_SQLE850A
 
#ifdef __cplusplus
extern "C" {
#endif
 
unsigned char sqle_850_500[256] = {
0x00,0x01,0x02,0x03,0x37,0x2d,0x2e,0x2f,0x16,0x05,0x25,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x3c,0x3d,0x32,0x26,0x18,0x19,0x3f,0x27,0x1c,0x1d,0x1e,0x1f,
0x40,0x4f,0x7f,0x7b,0x5b,0x6c,0x50,0x7d,0x4d,0x5d,0x5c,0x4e,0x6b,0x60,0x4b,0x61,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0x7a,0x5e,0x4c,0x7e,0x6e,0x6f,
0x7c,(0xc1),(0xc2),0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,
0xd7,0xd8,0xd9,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0x4a,0xe0,0x5a,0x5f,0x6d,
0x79,(0x81),(0x82),0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,
0x97,0x98,0x99,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xc0,0xbb,0xd0,0xa1,0x07,
0x68,0xdc,0x51,0x42,0x43,0x44,0x47,0x48,0x52,0x53,0x54,0x57,0x56,0x58,0x63,0x67,
0x71,0x9c,0x9e,0xcb,0xcc,0xcd,0xdb,0xdd,0xdf,0xec,0xfc,0x70,0xb1,0x80,0xbf,0xff,
0x45,0x55,0xce,0xde,0x49,0x69,0x9a,0x9b,0xab,0xaf,0xba,0xb8,0xb7,0xaa,0x8a,0x8b,
0x2b,0x2c,0x09,0x21,0x28,0x65,0x62,0x64,0xb4,0x38,0x31,0x34,0x33,0xb0,0xb2,0x24,
0x22,0x17,0x29,0x06,0x20,0x2a,0x46,0x66,0x1a,0x35,0x08,0x39,0x36,0x30,0x3a,0x9f,
0x8c,0xac,0x72,0x73,0x74,0x0a,0x75,0x76,0x77,0x23,0x15,0x14,0x04,0x6a,0x78,0x3b,
0xee,0x59,0xeb,0xed,0xcf,0xef,0xa0,0x8e,0xae,0xfe,0xfb,0xfd,0x8d,0xad,0xbc,0xbe,
0xca,0x8f,0x1b,0xb9,0xb6,0xb5,0xe1,0x9d,0x90,0xbd,0xb3,0xda,0xfa,0xea,0x3e,0x41
};
#ifdef __cplusplus
}
#endif
 
#endif /* SQL_H_SQLE850A */

コード・ページ 500 の 2 進照合をコード・ページ 850 の文字で実現する方法を確かめるには、sqle_850_500 にある照合順序のサンプルを調べてください。コード・ページ 850 のそれぞれの文字の照合順序における重要度は、コード・ページ 500 の対応するコード・ポイントに相当する以上のものではありません。

たとえば、文字 'a' を考えてみましょう。この文字は、図 27 に示されているように、コード・ページ 850 ではコード・ポイント X'61' になります。配列 sqle_850_500 で、文字 'a' には X'81' の重要度 (つまり、配列 sqle_850_500 の 98 番目の要素) が割り当てられています。

データベースが上記のサンプルに示したユーザー定義の照合順序で作成されている場合、これら 4 つの文字の照合方法はどうなるか考慮してみます。

文字
コード・ページ 850 コード・ポイント / 重要度 (sqle_850_500 からの)
'a'
X'61' / X'81'
'b'
X'62' / X'82'
'A'
X'41' / X'C1'
'B'
X'42' / X'C2'

重要度別のコード・ページ 850 のユーザー定義照合 (希望する照合) は、次のとおりです。

    'a' < 'b' < 'A' < 'B'

この例では、正確な重要度を指定して希望する照合を実現し、希望する動作をシミュレートしています。

実際の照合順序を注意深く観察すると、順序そのものは単に変換表になっているだけで、ソース・コード・ページがデータベースのコード・ページ (850)、ターゲット・コード・ページが希望する 2 進照合コード・ページ (500) であることが分かります。 DB2 提供の他の照合順序のサンプルにより、さまざまな変換が可能になります。必要な変換テーブルが DB2 で提供されていない場合は、 IBM 資料 Character Data Representation Architecture, Reference and Registry (SC09-2190) から追加の変換テーブルを入手できます。追加の変換テーブルは、この資料に同梱されている CD-ROM に収録されています。

照合順序の詳細については、照合順序の概説を参照してください。 DB2 で提供されている照合順序、およびユーザー定義の照合順序でデータベースを作成する方法を示したサンプル・プログラム (db_udcs.c) については、 管理 API 解説書 に記載されている CREATE DATABASE API を参照してください。

図 26. コード・ページ 500

CP00500

図 27. コード・ページ 850

CP00850


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]