Olacle障害対策Oracleトラブル対策の基礎知識(5)

文字化けに関するトラブルに強くなる【基礎編】

 
株式会社コーソル
渡部 亮太
2009/1/21
主な内容
・Oracleにおける文字コードの扱い
データベースキャラクタセット
NLS_LANG
文字コード変換
・文字化けの原因と対処
文字化けの典型的な発生パターン
(関連キーワード:データベースキャラクタセット、NLS_LANG、文字化け、Unicode、シフトJIS、日本語EUC)

NLS_LANG

 Oracleに接続するクライアントでは、クライアントの動作環境に応じて適切にNLS_LANGパラメータを設定する必要があります。NLS_LANGとは、多言語環境の動作設定を規定するパラメータです。NLS_LANGは3つのコンポーネントから構成されます。

書式 NLS_LANG
NLS_LANG = <LANGUAGE>_<TERRITORY>.<CHARACTERSET>
表3 NLS_LANGの3つのコンポーネント
コンポーネント 説明
LANGUAGE Oracleのメッセージ、ソート、曜日名および月名に使用する言語などの規則を指定します
TERRITORY デフォルトの日付、通貨単位および数値書式などの規則を指定します
CHARACTERSET クライアント・アプリケーションが使用するキャラクタセットを指定します

 UNIXプラットフォーム上では、NLS_LANGはシェルの環境変数として設定します。Windowsプラットフォームでは、NLS_LANGはレジストリ内で設定しますが、環境変数として設定することもできます。

 NLS_LANGの各コンポーネントの中で、文字コードに関連するのがCHARACTERSETコンポーネントです。CHARACTERSETコンポーネントには、表 2に示したデータベースキャラクタセットと同様の設定値から選択することができます。しかし、設定する値自体は、データベースキャラクタセットと同じにするのではなく、クライアント環境がサポートしているキャラクタセットを指定しなくてはなりません

 例えば、データベースキャラクタセットがJA16EUC(日本語EUCに相当)であるデータベースにWindows環境から接続する場合、NLS_LANGのCHARACTERSETコンポーネントには、JA16SJIS(またはJA16SJISTILDE)を指定しなくてはなりません注2。Windows環境は一般に日本語EUC文字コードに対応していませんから、JA16EUCを指定すると文字化けなどの現象が発生する場合があります。

注2:Windows環境ではデフォルトで設定済みです。

 なお本稿では、「NLS_LANGパラメータのCHARACTERSETコンポーネント」を「NLS_LANGのキャラクタセット」と略記します。

文字コード変換

 このように、クライアントの動作環境に合わせてNLS_LANGのキャラクタセットを指定すると、データベースキャラクタセットとNLS_LANGのキャラクタセットが異なる場合が出てきます。この場合、Oracleは自動的に文字コードの変換を行います。

図3 クライアント、データベース間の文字コード変換
fig3

 文字コードの変換は、一部の例外を除き、Oracleクライアント側で実行されます。これは、文字コード変換に伴う処理負荷の影響をOracle Databaseに与えないためです。

 なお、Oracle クライアントからOracle Databaseに対して文字データを送信する場合の文字コード変換はクライアント側で以下の手順で実行されます。

  1. Oracleクライアントから入力された文字データをいったんUnicodeに変換する
  2. Unicodeからデータベースキャラクタセットに対応した文字コードに変換する
  3. Oracle Databaseに文字データを送信する

 逆にOracle Databaseからクライアントに対して文字データを送信する場合も、同様にいったんUnicodeを経由してデータベースキャラクタセットからNLS_LANGのキャラクタセットへの文字コード変換が実行されます。

 このように文字コードの変換は、Unicodeを中継して行われます。図4ではその例として、キャラクタセットJA16SJIS、JA16EUC、JA16SJISTILDE間で文字コード変換を行った場合の、変換の仕組みを示しています。

 例えば、JA16SJISからJA16EUCに変換する場合は、シフトJISとUnicodeの変換表を基にいったんUnicodeに変換し、次に日本語EUCとUnicodeの変換表を基にUnicodeから日本語EUCに変換するという手順を取ります。JA16SJISからJA16SJISTILDEといった変換でも同様の流れとなります。

図4 文字コード変換と変換表(クリックで拡大)
fig4

 ただし、データベースキャラクタセットとNLS_LANGのキャラクタセットが同じ場合、Oracleは例外的に文字コードの変換を行いません。

文字化けの原因と対処

 さて、Oracleにおける文字コードの扱いが分かったところで、一般的な文字化けの発生原因と対処について整理します。

文字化けの典型的な発生パターン

 Oracleの文字コード処理において、文字化けが発生する可能性がある典型的なポイントを以下にまとめました。

図5 文字化けの主な発生ポイント
fig5

 では、順々に説明してゆきましょう。なお、以下の説明では、最も一般的な発生要因について触れています。文字化けはさまざまな要因で発生しますので、以下の説明以外の要因でも発生する可能性がありますから、状況に応じてより詳細な問題の切り分けを行ってください。ただし、ここで説明する問題の切り分けは、一般的な発生要因以外の場合でも有効な方法です。

前のページへ 2/3 次のページへ

Index
Oracleトラブル対策の基礎知識(5)
文字化けに関するトラブルに強くなる【基礎編】
  Page 1
・Oracleにおける文字コードの扱い
文字コードとは?
Oracleにおける文字コードの扱い
→ Page 2
 データベースキャラクタセット
NLS_LANG
文字コード変換
・文字化けの原因と対処
文字化けの典型的な発生パターン
  Page 3
 データ格納場面での文字化け
データ取得場面での文字化け
データ表示場面での文字化け

Oracleトラブル対策の基礎知識

TechTargetジャパン

Database Expert フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH