JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
データベースで使用する文字コードを変更する
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 項目をチェックしておくと、作業前にデータの伸張によって格納できないなどの問題箇所を事前に予測することができる。
関連事項