データベースで使用する文字コードを変更する Oracle 10g

Oracle 10g から ALTER DATABASE CHARACTER SET 文は廃止されている。
データベース・キャラクタセットを変換するには、検証をする CSSCAN(Character Set SCANner) ユーティリティ と実際に変換する CSALTER(Character Set ALTER?) プログラムを使用する。

CSALTER プログラムの実行には CCSCAN によるデータベースの全スキャン作業が必要である。

CSSCAN による変換前の検証

CSSCAN ユーティリティの実行には、まず csminst.sql を実行する必要がある。

場所は $ORACLE_HOME/rdbms/admin/csminst.sql

csmig というユーザーを作成するので、そのユーザー用のパスワードを入力する。
存在しないディレクトリオブジェクトへの READ 権限を設定してエラーになるが、これは良くわからない。 なかなか未完のユーティリティの香りが漂ってくるのを感じることができるエラーである。 ;)
また一部のプラットフォームで各国語対応が不完全のようにもみえる。NLS_LANG 環境変数を英語に設定すると文字化けする。

csscan のコマンドオプションは help=y でみることができる。

変更先のキャラクタセットを JA16SJISTILDE にしてスキャンした例 (実行するための最低限のオプション)

# csscan '/ as sysdba' full=y tochar='ja16sjistilde' array=102400 process=1

このオプションでスキャンを開始するとデータベース全体をスキャンする。 データがたくさん詰まっている運用中の環境に対して実行すると相当に負荷と時間がかかるので注意する。

実行が終了すると変換後の文字列から変換可能か (Convertible)、変換したら一部切捨てされるか (Truncation)、 損失するか (Lossy) などがログに出力される。

scan.txt
scan.out
scan.err

これらのログの内容で特に Truncation と Lossy の項目に注意する。

CSALTER によるデータベースキャラクタセットの変換

実際に変換するのはコマンドラインのユーティリティではなく PL/SQL である。 通常は使う機会がないからだろうか…標準コマンドは廃止されコマンドインターフェイスも用意されずかわいそうな感じがする。
$ORACLE_HOME/rdbms/admin/csalter.plb (ラップされたモジュール)

SQLPlus から実行する。

# cd $ORACLE_HOME/rdbms/admin/
# sqlplus / as sysdba
SQL> @csalter.plb normal
...
変換完了

変換可能なキャラクタセットの例

  • US7ASCII ⇒ JA16xxx または JA16xxxTILDE
  • US7ASCII ⇒ UTF8 または AL32UTF8
  • UTF8 ⇒ AL32UTF8

ALTER DATABASE CHARSET 文と同様に、SJIS ⇔ EUC 間の変換はできない。 色々と細工して変換するよりも再構築して エクスポート、インポートユーティリティ を移行する方が安心である。
その場合にも(急がば回れということで) CSSCAN ユーティリティでユーザー単位に Truncation、Lossy 項目をチェックしておくと、作業前にデータの伸張によって格納できないなどの問題箇所を事前に予測することができる。



関連事項

データベース・キャラクタセットを変更するの関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー