第2章 アプリケーションの設計
2.5 文字コード系の考慮
2.5.2 コード変換の考慮
アプリケーションが使用する文字コード系と、データベースに格納されるデータの文字コード系が異なる場合、Symfoware/
RDBは自動的にコード変換を行います。
コード変換について以下の順に説明します。
・
コード変換の発生条件・
コード変換と文字列長・
コード変換指定に従わないものコード変換の発生条件
アプリケーションが扱うデータとデータベースに格納されるデータの文字コード系が異なる場合、Symfoware/RDBは双方 向でコード変換を行って文字コード系を調整します。
データベースに格納されるデータを抽出する際、アプリケーションの文字コード系に存在しない文字コードは、アンダー スコア“_”に変換されます。逆に、アプリケーションからデータベースに格納する際、データベースの文字コード系に存在 しない文字コードが含まれると、コード変換エラーとなります。
C言語の場合のコード変換
クライアント用の動作環境ファイルのパラメタCHAR_SETおよびNCHAR_CODEに指定された文字コード系と、デー タベースの文字コード系の間のコード変換の有無を以下に示します。
表2.20 アプリケーションのコード変換(文字列型)
CHAR_SETの 指定
データベースの文字コード系 EUC
コード のS90
コード EUC コード のU90
コード
シフト JISコー
ド
UNICOD E
EUC_S90 ◎ × ○ ○
EUC_U90
× ◎ ○ ○
EUC
SJIS ○ ○ ◎ ○
UTF-8 ○ ○ ○ ◎
◎:コード変換を行わず処理
○:コード変換を行って処理
×:エラー(文字コード系を指定することはできません)
表2.21 アプリケーションのコード変換(各国語文字列型)
NCHAR_COD Eの指定
データベースの文字コード系 EUC
コード のS90
コード EUC コード のU90
コード
シフト JISコー
ド
UNICOD E
EUC_S90
◎ × ○ ○
COBOL_EUC _S90
EUC_U90
× ◎ ○ ○
EUC
COBOL_EUC _U90 COBOL_EUC
SJIS ○ ○ ◎ ○
UTF-8
○ ○ ○ ◎
UCS2 UCS2B
◎:コード変換を行わず処理
○:コード変換を行って処理
×:エラー(文字コード系を指定することはできません)
コード変換と文字列長
データベースの文字コード系と、SQL埋込みホストプログラム内のホスト変数で使用する文字列の文字コード系が異なる 場合、データ操作でコード変換が発生します。それぞれの文字コード系によってはデータ長が増減することがあるため、
SQL埋込みホストプログラムを作成する場合に考慮が必要です。
ここでは、文字コード系と使用できる文字列長について説明します。
文字コード系における1文字のバイト数
SQL埋込みホストプログラム中のホスト変数内で使用できる文字列の文字コード系は、EUCコード、UTF-8形式または シフトJISコードです。また、各国語文字列の文字コード系は、EUCコード、COBOL_EUC形式、UCS-2形式、バイトス ワップしたUCS-2形式、UTF-8形式またはシフトJISコードです。
それぞれの文字コード系における、1文字のバイト数を以下に示します。
表2.22 1文字のバイト数
文字コード系 文字の種別 バイト数
EUCコード
英数字および制御文字 1バイト
拡張漢字および利用者定義文字 3バイト
その他の日本語文字 2バイト
UTF-8形式 英数字および制御文字 1バイト
各国語文字 2~6バイト
シフトJIS コード
英数字および制御文字 1バイト
半角カタカナ 1バイト
各国語文字 2バイト
また、それぞれのコード系における、各国語文字1文字のバイト数を以下に示します。
表2.23 1文字のバイト数(各国語文字の場合)
文字コード系 文字の種別 バイト数
EUCコード 拡張漢字および利用者定義文字 3バイト
その他の日本語文字 2バイト
COBOL_EUC形
式 日本語文字 2バイト
UCS-2形式 すべての文字 2バイトまたは4バイト
(注) バイトスワップした
UCS-2形式 すべての文字 2バイトまたは4バイト
(注)
UTF-8形式 日本語文字 2~6バイト
シフトJISコード 日本語文字 2バイト
注) UCS-2形式およびバイトスワップしたUCS-2形式では、補助文字(1~16面の4バイト文字)は2文字となります。
コード変換と文字列の拡大・縮小
データベースの文字コード系とSQL埋込みホストプログラム内で使用する文字列の文字コード系が異なる場合、デー タに対してコード変換が発生します。このとき、同じ文字でも文字コード系によってバイト数が異なる場合があるため、
文字列が拡大・縮小することがあります。
文字コード系による文字列の拡大・縮小の割合を以下に示します。
表2.24 文字列の拡大・縮小
データベースの文字コード系
アプリケーションの文 字コード系
入力データ 出力データ 最小値 最大値 最小値 最大値
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倍
また、文字コード系による各国語文字列の拡大・縮小の割合を以下に示します。
表2.25 各国語文字列の拡大・縮小
データベースの文字コード系
アプリケーションの文 字コード系
入力データ 出力データ 最小値 最大値 最小値 最大値
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バイトを超えてしまう場合 があります。そこで、上記の拡大・縮小の割合を基に、コード変換に関係なく使用できる文字列のデータ長を以下に 示します。
表2.26 使用可能な文字列の最大長
データベースの文字コード系
アプリケーションの文
字コード系 使用可能なデータ長
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 バイト
また、コード変換に関係なく使用できる各国語文字列のデータ長を以下に示します。
表2.27 使用可能な各国語文字列の最大長
データベースの文字コード系
アプリケーションの文
字コード系 使用可能なデータ長
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)の指定により、クライア ントまたはサーバのどちらかで行います。ただし、この変換指定に従わず、データベースの文字コード系に従って処理さ れるものは、以下のとおりです。