Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU -
目次 索引 前ページ次ページ

第2章 アプリケーションの設計> 2.2 文字コード系の考慮

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

○:コード変換を行って処理

UNIX系システムまたはWindows(R)からグローバルサーバに接続する場

コード変換の方式は、RDA-SVが管理するクライアント環境管理簿に登録されているEBCDIC変換情報に従って行われます。

クライアント環境管理簿の詳細については、利用するサーバに対応した“RDA-SVオペレーションガイド”を参照してください。

同類文字コード系の扱

文字コード系には、各ベンダが独自に拡張した文字コード系が複数存在します。例えば、日本語EUCコードには、UNIX系システムが標準に使用するS90コードの他に、他のベンダが独自に拡張した文字コード系があります。富士通株式会社においては、JEFコードとの親和性を持たせたU90コードが存在します。

これらの文字コード系の間のコード変換はサポートしていません。

各ベンダが拡張した文字コード系同士では、文字のコードが一致しないものが存在します。データベースに格納されたデータを扱う場合は1つの文字コード系で扱うので、同類の文字コード系であっても同時にデータベースに格納することはできません。

万が一、同時に格納した場合、どちらかの文字コード系でデータを扱うため、文字化けによるデータの損失等が発生し、データベースを破壊する可能性があります。したがって、十分注意して文字コード系を扱う必要があります。

コード変換と文字列

データベースの文字コード系と、SQL埋込みホストプログラム内のホスト変数で使用する文字列の文字コード系が異なる場合、データ操作でコード変換が発生します。それぞれの文字コード系によってはデータ長が増減することがあるため、SQL埋込みホストプログラムを作成する場合に考慮が必要です。

ここでは、文字コード系と使用できる文字列長について説明します。

◆文字コード系における1文字のバイト

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文字のバイト数を以下に示します。

[表:1文字のバイト数]

文字コード系

文字の種別

バイト数

日本語EUCコード(S90コードまたはU90コード)

英数字および制御文字

1バイト

拡張漢字および利用者定義文字

3バイト

その他の日本語文字

2バイト

UNICODE(UTF-8形式)

英数字および制御文字

1バイト

各国語文字

2〜6バイト

シフトJISコード

英数字および制御文字

1バイト

半角カタカナ

1バイト

各国語文字

2バイト

また、それぞれのコード系における、各国語文字1文字のバイト数を以下に示します。

[表: 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)の指定により、クライアントまたはサーバのどちらかで行います。ただし、この変換指定に従わず、データベースの文字コード系に従って処理されるものは、以下のとおりです。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005