Oracle Expressでは標準のキャラクタセットとしてAL32UTF8が設定されます。
キャラクタセットを意識しないでデータベースの移行やデータベース間のデータ連携をすると文字コード関連のエラーが多発する場合があります。
原因としては、キャラクタセットによりマルチバイト文字のバイト数が異なる為です。
例えば、JA16SJIS(SJIS)はマルチバイト文字を1~2バイトで扱い、AL32UTF8(UTF)はマルチバイト文字を1~3 バイトで扱います。
この記事では、Oracle Expressのキャラクタセットを変更する方法を記載していきます。
キャラクタセットの変更手順
Oracle Expressのキャラクタセットを変更するには、インスタンスを再作成する方法もありますが、ここでは、インスタンスの再作成が不要なCSALTERスクリプトを使用した変更手順を記載していきます。
変更手順は以下の流れで実施します。
- CSMINSTスクリプトの実行
- CSSCANの実行
- CSALTERスクリプトの実行
環境
Oracle Database Express Edition 11g Release 2
キャラクタセットの調べ方
変更手順には含まれませんが、変更前に現在のキャラクタセットを確認します。
sqlplusなどで以下のコマンドを実行します。
SELECT NLS_CHARSET_NAME(NLS_CHARSET_ID('CHAR_CS')) FROM DUAL; NLS_CHARSET_NAME ---------------- AL32UTF8
CSMINST
CSSCAN前の準備としてcsminst.sqlスクリプトを実行します。
Oracle Expressではスクリプトが存在しないので、製品版などからコピーしてきます。
スクリプトの格納場所は、$ORACLE_HOME/rdbms/admin/csminst.sqlです。
cd $ORACLE_HOME/rdbms/admin sqlplus / as sysdba @csminst.sql
スクリプトを実行するとCSMIGユーザが作成され、権限や表領域の割当てが行われます。
オブジェクトが存在しないなどのエラーが表示されますが特に気にする必要はありません。
CSSCAN
キャラクタセットの変更前には、データベース全体のデータをスキャンする必要があります。
スキャンはCSSSCAN(Character Set Scanner)ユーティリティを使用します。
Oracle Expressではユーティリティが存在しないので、製品版などからコピーしてきます。
ユーティリティの格納場所は、$ORACLE_HOME/bin/csscan.exeです。
cd $ORACLE_HOME/bin CSSCAN '/ as sysdba' FULL=y TOCHAR='ja16sjistilde' ARRAY=102400 PROCESS=3
オプションを簡単に説明します。
TOCHAR:変更後のキャラクタセット
PROCESS:同時スキャンプロセス数
CSALTER
最後にcsalter.plbスクリプトを実行します。
Oracle Expressではスクリプトが存在しないので、製品版などからコピーしてきます。
スクリプトの格納場所は、$ORACLE_HOME/rdbms/admin/csalter.plbです。
cd $ORACLE_HOME/rdbms/admin sqlplus / as sysdba @csalter.plb nomal
最後に
CSALTERスクリプトを使用してキャラクタセットを変更する場合、変更元のすべての文字が変更先のキャラクタセットで使用可能であり、同じコードポイント(バイト列)を持つ必要があります。
この為、変更可能なキャラクタセットは限られており、SJISからUTF8などへ変更することはできないそうです。
※サブセットのキャラクタセットからスーパセットへの変更のみ可能
キャラクタセットを変更するにはデータベースを再構築する必要があります。