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 |
◎:コード変換を行わず処理
○:コード変換を行って処理
×:エラー(文字コード系を指定することはできません)
グローバルサーバのデータベースに対しては以下のとおりです。
CHAR_SETの指定 |
データベースの文字コード系 |
|
---|---|---|
EBCDIC |
JEF |
|
EUC_S90 |
○ |
○ |
EUC_U90 |
○ |
○ |
EUC |
||
SJIS |
○ |
○ |
UTF-8 |
○ |
○ |
○:コード変換を行って処理
NCHAR_CODEの指定 |
データベースの文字コード系 |
|
---|---|---|
EBCDIC |
JEF |
|
EUC_S90 |
○ |
○ |
COBOL_EUC_S90 |
||
EUC_U90 |
○ |
○ |
EUC |
||
COBOL_EUC_U90 |
||
COBOL_EUC |
||
SJIS |
○ |
○ |
UTF-8 |
○ |
○ |
UCS2 |
||
UCS2B |
○:コード変換を行って処理
コード変換の方式は、RDA-SVが管理するクライアント環境管理簿に登録されているEBCDIC変換情報に従って行われます。
クライアント環境管理簿の詳細については、利用するサーバに対応した“RDA-SVオペレーションガイド”を参照してください。
文字コード系には、各ベンダが独自に拡張した文字コード系が複数存在します。例えば、日本語EUCコードには、UNIX系システムが標準に使用するS90コードの他に、他のベンダが独自に拡張した文字コード系があります。富士通株式会社においては、JEFコードとの親和性を持たせたU90コードが存在します。
これらの文字コード系の間のコード変換はサポートしていません。
各ベンダが拡張した文字コード系同士では、文字のコードが一致しないものが存在します。データベースに格納されたデータを扱う場合は1つの文字コード系で扱うので、同類の文字コード系であっても同時にデータベースに格納することはできません。万が一、同時に格納した場合、どちらかの文字コード系でデータを扱うため、文字化けによるデータの損失等が発生し、データベースを破壊する可能性があります。したがって、十分注意して文字コード系を扱う必要があります。
データベースの文字コード系と、SQL埋込みホストプログラム内のホスト変数で使用する文字列の文字コード系が異なる場合、データ操作でコード変換が発生します。それぞれの文字コード系によってはデータ長が増減することがあるため、SQL埋込みホストプログラムを作成する場合に考慮が必要です。
ここでは、文字コード系と使用できる文字列長について説明します。
SQL埋込みホストプログラム中のホスト変数内で使用できる文字列の文字コード系は、日本語EUCコード(S90コードまたはU90コード)、UNICODE(UTF-8形式)またはシフトJISコードです。また、各国語文字列の文字コード系は、日本語EUCコード(S90コードまたはU90コード)、日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード)、UNICODE(UCS-2形式)、UNICODE(バイトスワップしたUCS-2形式)、UNICODE(UTF-8形式)またはシフトJISコードです。
それぞれの文字コード系における、1文字のバイト数を以下に示します。
文字コード系 |
文字の種別 |
バイト数 |
---|---|---|
日本語EUCコード(S90コードまたはU90コード) |
英数字および制御文字 |
1バイト |
拡張漢字および利用者定義文字 |
3バイト |
|
その他の日本語文字 |
2バイト |
|
UNICODE(UTF-8形式) |
英数字および制御文字 |
1バイト |
各国語文字 |
2〜6バイト |
|
シフトJISコード |
英数字および制御文字 |
1バイト |
半角カタカナ |
1バイト |
|
各国語文字 |
2バイト |
また、それぞれのコード系における、各国語文字1文字のバイト数を以下に示します。
文字コード系 |
文字の種別 |
バイト数 |
---|---|---|
日本語EUCコード(S90コードまたはU90コード) |
拡張漢字および利用者定義文字 |
3バイト |
その他の日本語文字 |
2バイト |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
日本語文字 |
2バイト |
UNICODE(UCS-2形式) |
すべての文字 |
2バイト |
UNICODE(バイトスワップしたUCS-2形式) |
すべての文字 |
2バイト |
UNICODE(UTF-8形式) |
日本語文字 |
2〜6バイト |
シフトJISコード |
日本語文字 |
2バイト |
データベースの文字コード系とSQL埋込みホストプログラム内で使用する文字列の文字コード系が異なる場合、データに対してコード変換が発生します。このとき、同じ文字でも文字コード系によってバイト数が異なる場合があるため、文字列が拡大・縮小することがあります。
文字コード系による文字列の拡大・縮小の割合を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
入力データ |
出力データ |
||
---|---|---|---|---|---|
最小値 |
最大値 |
最小値 |
最大値 |
||
日本語EUCコード |
日本語EUCコード(S90コードまたはU90コード) |
1倍 |
1倍 |
1倍 |
1倍 |
シフトJISコード |
1倍 |
2倍 |
1/2倍 |
1倍 |
|
UNICODE(UTF-8形式) |
1/3倍 |
3/2倍 |
2/3倍 |
3倍 |
|
UNICODE |
日本語EUCコード(S90コードまたはU90コード) |
2/3倍 |
3倍 |
1/3倍 |
3/2倍 |
シフトJISコード |
1倍 |
3倍 |
1/3倍 |
1倍 |
|
UNICODE(UTF-8形式) |
1倍 |
1倍 |
1倍 |
1倍 |
|
シフトJISコード |
日本語EUCコード(S90コードまたはU90コード) |
1/2倍 |
1倍 |
1倍 |
2倍 |
シフトJISコード |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE(UTF-8形式) |
1/3倍 |
1倍 |
1倍 |
3倍 |
また、文字コード系による各国語文字列の拡大・縮小の割合を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
入力データ |
出力データ |
||
---|---|---|---|---|---|
最小値 |
最大値 |
最小値 |
最大値 |
||
日本語EUCコード |
日本語EUCコード(S90コードまたはU90コード) |
2/3倍 |
1倍 |
1倍 |
3/2倍 |
シフトJISコード |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE(UTF-8形式) |
1/3倍 |
1倍 |
1倍 |
3倍 |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE(バイトスワップしたUCS-2形式) |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE |
日本語EUCコード(S90コードまたはU90コード) |
2/3倍 |
2倍 |
1/2倍 |
3/2倍 |
シフトJISコード |
1倍 |
2倍 |
1/2倍 |
1倍 |
|
UNICODE(UTF-8形式) |
1/3倍 |
2倍 |
1/2倍 |
3倍 |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE(バイトスワップしたUCS-2形式) |
1倍 |
1倍 |
1倍 |
1倍 |
|
シフトJISコード |
日本語EUCコード(S90コードまたはU90コード) |
2/3倍 |
1倍 |
1倍 |
3/2倍 |
シフトJISコード |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE(UTF-8形式) |
1/3倍 |
1倍 |
1倍 |
3倍 |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
1倍 |
1倍 |
1倍 |
1倍 |
|
UNICODE(バイトスワップしたUCS-2形式) |
1倍 |
1倍 |
1倍 |
1倍 |
コード変換によりデータ長が拡大・縮小した場合に、ホスト変数や列長の定量制限の32,000バイトを超えてしまう場合があります。そこで、上記の拡大・縮小の割合を基に、コード変換に関係なく使用できる文字列のデータ長を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
使用可能なデータ長 |
---|---|---|
日本語EUCコード |
日本語EUCコード(S90コードまたはU90コード) |
32,000 バイト |
シフトJISコード |
16,000 バイト |
|
UNICODE(UTF-8形式) |
10,666 バイト |
|
シフトJISコード |
日本語EUCコード(S90コードまたはU90コード) |
16,000 バイト |
シフトJISコード |
32,000 バイト |
|
UNICODE(UTF-8形式) |
10,666 バイト |
|
UNICODE |
日本語EUCコード(S90コードまたはU90コード) |
10,666 バイト |
シフトJISコード |
10,666 バイト |
|
UNICODE(UTF-8形式) |
32,000 バイト |
また、コード変換に関係なく使用できる各国語文字列のデータ長を以下に示します。
データベースの文字コード系 |
アプリケーションの文字コード系 |
使用可能なデータ長 |
---|---|---|
日本語EUCコード |
日本語EUCコード(S90コードまたはU90コード) |
21,333 バイト |
シフトJISコード |
32,000 バイト |
|
UNICODE(UTF-8形式) |
10,666 バイト |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
32,000 バイト |
|
UNICODE(バイトスワップしたUCS-2形式) |
32,000 バイト |
|
シフトJISコード |
日本語EUCコード(S90コードまたはU90コード) |
21,333 バイト |
シフトJISコード |
32,000 バイト |
|
UNICODE(UTF-8形式) |
10,666 バイト |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
32,000 バイト |
|
UNICODE(バイトスワップしたUCS-2形式) |
32,000 バイト |
|
UNICODE |
日本語EUCコード(S90コードまたはU90コード) |
16,000 バイト |
シフトJISコード |
16,000 バイト |
|
UNICODE(UTF-8形式) |
16,000 バイト |
|
日本語EUCコード(COBOL_EUC形式のS90コードまたはCOBOL_EUC形式のU90コード) |
32,000 バイト |
|
UNICODE(バイトスワップしたUCS-2形式) |
32,000 バイト |
取り出すデータの有効な長さが32,000バイトを超える場合は、標識変数に0または32,000が格納されます。この場合は、コード変換が発生しない環境で動作させてください。
変換先に該当する文字コードが存在しない文字は、アンダースコア“_”に変換されます。
コード変換は、クライアント用の動作環境ファイルの実行パラメタ(CHARACTER_TRANSLATE)の指定により、クライアントまたはサーバのどちらかで行います。ただし、この変換指定に従わず、データベースの文字コード系に従って処理されるものは、以下のとおりです。
ORDER BY句による整列順序
SQL述語の大小比較結果
集合関数の最大または最小値
目次
索引
![]() ![]() |