[Oracle]CSALTERを使用してOracle Expressのキャラクタセットを変更する
2020/01/09
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などへ変更することはできないそうです。
※サブセットのキャラクタセットからスーパセットへの変更のみ可能
キャラクタセットを変更するにはデータベースを再構築する必要があります。
Google AdSense PC
Google AdSense PC
関連記事
-
-
[SQL Server]IDENTITYの値を初期化する
ID値の初期化(リセット)方法 IDENTITYプロパティを設定した列のID値を初期化(リセット)する方法を記載します。 現在のID値を確認する ID値を確認す …
-
-
[SQL Server]除算時の注意点
SQLServerで除算結果が小数になる場合 たとえば、1100グラムをキロに換算する場合は「1100 / 1000」で計算すれば「1.1kg」と求められるが …
-
-
[Oracle]Oracle Clientのアンインストール方法
Oracle Clientをレジストリを含め完全に削除することがありましたので、この記事では削除手順を記載します。 削除手順ではレジストリを変更しますので十分注 …
-
-
[SQLServer]形式指定で日付を取得する方法
SQLServerで形式を指定して日付を取得する 日付形式を指定するために、CONVERT関数、または、FORMAT関数を使用します。 CONVERT関数とFO …
-
-
[SQL Server]クロス集計の方法
PIVOTを使ってクロス集計する SQL ServerでExcelのピボットテーブルのようなクロス集計をするには、PIVOT関係演算子を使って集計することができ …
-
-
[Oracle]トリガーの実行順序を設定する方法
FOLLOWS句を使用して実行順序を設定する 1つの表に対して同レベル(タイミング)のトリガーを複数作成することはできますが、実行順序は保証されていません。 実 …
-
-
Oracle 11g XEへのデータ移行方法を検討してみる
Oracleのデータ移行時は移行元と移行先の文字コードに注意する必要があります。 Windows環境のOracleでは「JA16SJIS」や「JA16SJIST …
-
-
ODP.NETをNuGetからインストールする
ODP.NETのインストール手順 Oracle 12cから公式のODP.NETがNuGetに追加されました。 この記事ではODP.NETをNuGetからインスト …
-
-
[Oracle]Data Pumpを使用したデータベースのバックアップ
Data Pump機能のexpdp/impdpコマンドを使用するとデータベース全体、スキーマ単位、表単位など対象範囲を指定したバックアップやリストアを行うことが …
-
-
[Oracle]データベーストリガーの作成方法
DMLトリガーを作成する データベーストリガーの中でももっとも一般的なDMLトリガーの作成方法と簡単な使用方法を記載していきます。 トリガーとは? トリガーとは …