Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU - |
目次 索引 |
第2章 アプリケーションの設計 | > 2.2 文字コード系の考慮 |
アプリケーションが使用する文字コード系と、データベースに格納されるデータの文字コード系が異なる場合、Symfoware/RDBは自動的にコード変換を行います。
コード変換について以下の順に説明します。
アプリケーションが扱うデータとデータベースに格納されるデータの文字コード系が異なる場合、Symfoware/RDBは双方向でコード変換を行って文字コード系を調整します。
データベースに格納されるデータを抽出する際、アプリケーションの文字コード系に存在しない文字コードは、アンダースコア“_”に変換されます。逆に、アプリケーションからデータベースに格納する際、データベースの文字コード系に存在しない文字コードが含まれると、コード変換エラーとなります。
クライアント用の動作環境ファイルのパラメタCHAR_SETおよびNCHAR_CODEに指定された文字コード系と、データベースの文字コード系の間のコード変換の有無を以下に示します。
CHAR_SETの指定 |
データベースの文字コード系 |
|||
---|---|---|---|---|
EUCコードのS90コード |
EUCコードのU90コード |
シフトJISコード |
UNICODE |
|
EUC_S90 |
◎ |
× |
○ |
○ |
EUC_U90 |
× |
◎ |
○ |
○ |
EUC |
||||
SJIS |
○ |
○ |
◎ |
○ |
UTF-8 |
○ |
○ |
○ |
◎ |
◎:コード変換を行わず処理
○:コード変換を行って処理
×:エラー(文字コード系を指定することはできません)
NCHAR_CODEの指定 |
データベースの文字コード系 |
|||
---|---|---|---|---|
EUCコードのS90コード |
EUCコードのU90コード |
シフトJISコード |
UNICODE |
|
EUC_S90 |
◎ |
× |
○ |
○ |
COBOL_EUC_S90 |
||||
EUC_U90 |
× |
◎ |
○ |
○ |
EUC |
||||
COBOL_EUC_U90 |
||||
COBOL_EUC |
||||
SJIS |
○ |
○ |
◎ |
○ |
UTF-8 |
○ |
○ |
○ |
◎ |
UCS2 |
||||
UCS2B |
◎:コード変換を行わず処理
○:コード変換を行って処理
×:エラー(文字コード系を指定することはできません)
データベースの文字コード系と、SQL埋込みホストプログラム内のホスト変数で使用する文字列の文字コード系が異なる場合、データ操作でコード変換が発生します。それぞれの文字コード系によってはデータ長が増減することがあるため、SQL埋込みホストプログラムを作成する場合に考慮が必要です。
ここでは、文字コード系と使用できる文字列長について説明します。
SQL埋込みホストプログラム中のホスト変数内で使用できる文字列の文字コード系は、EUCコード、UTF-8形式またはシフトJISコードです。また、各国語文字列の文字コード系は、EUCコード、COBOL_EUC形式、UCS-2形式、バイトスワップしたUCS-2形式、UTF-8形式またはシフトJISコードです。
それぞれの文字コード系における、1文字のバイト数を以下に示します。
文字コード系 |
文字の種別 |
バイト数 |
---|---|---|
EUCコード |
英数字および制御文字 |
1バイト |
拡張漢字および利用者定義文字 |
3バイト |
|
その他の日本語文字 |
2バイト |
|
UTF-8形式 |
英数字および制御文字 |
1バイト |
各国語文字 |
2〜6バイト |
|
シフトJISコード |
英数字および制御文字 |
1バイト |
半角カタカナ |
1バイト |
|
各国語文字 |
2バイト |
また、それぞれのコード系における、各国語文字1文字のバイト数を以下に示します。
文字コード系 |
文字の種別 |
バイト数 |
---|---|---|
EUCコード |
拡張漢字および利用者定義文字 |
3バイト |
その他の日本語文字 |
2バイト |
|
COBOL_EUC形式 |
日本語文字 |
2バイト |
UCS-2形式 |
すべての文字 |
2バイト |
バイトスワップしたUCS-2形式 |
すべての文字 |
2バイト |
UTF-8形式 |
日本語文字 |
2〜6バイト |
シフトJISコード |
日本語文字 |
2バイト |
データベースの文字コード系とSQL埋込みホストプログラム内で使用する文字列の文字コード系が異なる場合、データに対してコード変換が発生します。このとき、同じ文字でも文字コード系によってバイト数が異なる場合があるため、文字列が拡大・縮小することがあります。
文字コード系による文字列の拡大・縮小の割合を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
入力データ |
出力データ |
||
---|---|---|---|---|---|
最小値 |
最大値 |
最小値 |
最大値 |
||
EUCコード |
EUCコード |
1倍 |
1倍 |
1倍 |
1倍 |
シフトJISコード |
1倍 |
2倍 |
1/2倍 |
1倍 |
|
UTF-8形式 |
1/3倍 |
3/2倍 |
2/3倍 |
3倍 |
|
UNICODE |
EUCコード |
2/3倍 |
3倍 |
1/3倍 |
3/2倍 |
シフトJISコード |
1倍 |
3倍 |
1/3倍 |
1倍 |
|
UTF-8形式 |
1倍 |
1倍 |
1倍 |
1倍 |
|
シフトJISコード |
EUCコード |
1/2倍 |
1倍 |
1倍 |
2倍 |
シフトJISコード |
1倍 |
1倍 |
1倍 |
1倍 |
|
UTF-8形式 |
1/3倍 |
1倍 |
1倍 |
3倍 |
また、文字コード系による各国語文字列の拡大・縮小の割合を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
入力データ |
出力データ |
||
---|---|---|---|---|---|
最小値 |
最大値 |
最小値 |
最大値 |
||
EUCコード |
EUCコード |
2/3倍 |
1倍 |
1倍 |
3/2倍 |
シフトJISコード |
1倍 |
1倍 |
1倍 |
1倍 |
|
UTF-8形式 |
1/3倍 |
1倍 |
1倍 |
3倍 |
|
COBOL_EUC形式 |
1倍 |
1倍 |
1倍 |
1倍 |
|
バイトスワップしたUCS-2形式 |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE |
EUCコード |
2/3倍 |
2倍 |
1/2倍 |
3/2倍 |
シフトJISコード |
1倍 |
2倍 |
1/2倍 |
1倍 |
|
UTF-8形式 |
1/3倍 |
2倍 |
1/2倍 |
3倍 |
|
COBOL_EUC形式 |
1倍 |
1倍 |
1倍 |
1倍 |
|
バイトスワップしたUCS-2形式 |
1倍 |
1倍 |
1倍 |
1倍 |
|
シフトJISコード |
EUCコード |
2/3倍 |
1倍 |
1倍 |
3/2倍 |
シフトJISコード |
1倍 |
1倍 |
1倍 |
1倍 |
|
UTF-8形式 |
1/3倍 |
1倍 |
1倍 |
3倍 |
|
COBOL_EUC形式 |
1倍 |
1倍 |
1倍 |
1倍 |
|
バイトスワップしたUCS-2形式 |
1倍 |
1倍 |
1倍 |
1倍 |
コード変換によりデータ長が拡大・縮小した場合に、ホスト変数や列長の定量制限の32,000バイトを超えてしまう場合があります。そこで、上記の拡大・縮小の割合を基に、コード変換に関係なく使用できる文字列のデータ長を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
使用可能なデータ長 |
---|---|---|
EUCコード |
EUCコード |
32,000 バイト |
シフトJISコード |
16,000 バイト |
|
UTF-8形式 |
10,666 バイト |
|
シフトJISコード |
EUCコード |
16,000 バイト |
シフトJISコード |
32,000 バイト |
|
UTF-8形式 |
10,666 バイト |
|
UNICODE |
EUCコード |
10,666 バイト |
シフトJISコード |
10,666 バイト |
|
UTF-8形式 |
32,000 バイト |
また、コード変換に関係なく使用できる各国語文字列のデータ長を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
使用可能なデータ長 |
---|---|---|
EUCコード |
EUCコード |
21,333 バイト |
シフトJISコード |
32,000 バイト |
|
UTF-8形式 |
10,666 バイト |
|
COBOL_EUC形式 |
32,000 バイト |
|
バイトスワップしたUCS-2形式 |
32,000 バイト |
|
シフトJISコード |
EUCコード |
21,333 バイト |
シフトJISコード |
32,000 バイト |
|
UTF-8形式 |
10,666 バイト |
|
COBOL_EUC形式 |
32,000 バイト |
|
バイトスワップしたUCS-2形式 |
32,000 バイト |
|
UNICODE |
EUCコード |
16,000 バイト |
シフトJISコード |
16,000 バイト |
|
UTF-8形式 |
16,000 バイト |
|
COBOL_EUC形式 |
32,000 バイト |
|
UNICODE(バイトスワップしたUCS-2形式) |
32,000 バイト |
取り出すデータの有効な長さが32,000バイトを超える場合は、標識変数に0または32,000が格納されます。この場合は、コード変換が発生しない環境で動作させてください。
コード変換は、クライアント用の動作環境ファイルの実行パラメタ(CHARACTER_TRANSLATE)の指定により、クライアントまたはサーバのどちらかで行います。ただし、この変換指定に従わず、データベースの文字コード系に従って処理されるものは、以下のとおりです。
ORDER BY句による整列順序
SQL述語の大小比較結果
集合関数の最大または最小値
目次 索引 |