(0)目次&概説
(1) 記事の目的
(1-1) 目的
(1-2) 前提条件
(1-2-1) 「props$」更新はNG
(1-2-2) 10g以降は”ALTER DATABASE”での更新はNG
(1-2-3) 上記の禁止事項を踏まえての方針
(2) キャラクタセット変更手順
(3) 失敗した場合のリカバリ手順
(4) 用語説明
(4-1) キャラクタセットとは?
(4-2) データディクショナリーとは?
(5) エラー対応
(5-1) エラー:error while loading shared libraries
(5-2) エラー:Unrecognized convertible data found in scanner result
(5-3) エラー:Sorry only one session is allowed to run this script
(1) 記事の目的
(1-1) 目的
Oracleデータベースを作成した後にキャラクタ・セット(DBサーバ側のエンコーディング方式)を変更する際の手順について備忘のために残します。なお今回の手順は10g・11g用の手順で、それ以外のバージョンには適用できない点にご注意ください(※それ以外のバージョンでは手順が異なってきます)。
(1-2) 前提条件
(1-2-1) 「props$」更新はNG
OracleDBの「props$」テーブルにキャラクタセットの情報が入っていますが、この値を更新することはOracleとしてサポートしない作業であり、もしもこの作業によりデータベースが破損してもサポートできない、といった内容がOracleのサイトにも記載されています。
https://support.oracle.com/knowledge/Oracle%20Database%20Products/2046201_1.html#aref_section33
(1-2-2) 10g以降は”ALTER DATABASE”での更新はNG
10g、11g、12cの場合は”Alter database character set”でCharacter Setを変更するのはNGとされています。この操作をすると少なくとも「データディクショナリー」オブジェクトは壊れてしまうのと、高確率で業務データも壊れるリスクがあるためです。もしも誤ってこの操作を実行してしまった場合は、OracleとしてはDBのリストアによる復旧を推奨しています。
自身のバージョンは動的パフォーマンスビュー「V$VERSION」でチェックします。
SELECT * FROM V$VERSION;
(図122)
(1-2-3) 上記の禁止事項を踏まえての方針
1)1つ目がCSALTERというPL/SQLのモジュールを使用します。実態は「csalter.plb」というPL/SQLファイルをラップしたモジュールになっています。
(2) キャラクタセット変更手順
別記事「OracleDB11gのキャラクタセットを変更する手順について(手順編)」の2章にて記載
(3) 失敗した場合の対応
別記事「OracleDB11gのキャラクタセットを変更する手順について(手順編)」の3章にて記載
(4) 用語説明
(4-1) キャラクタセットとは?
CHAR型・CLOB型・VARCHAR型のデータや各種メタデータ(テーブル名・カラム名やSQL文など)で利用される「エンコーディング方式」を指定する値です。DBに文字列を格納する際は、文字列がそのまま格納される訳ではなく、実際は文字に対応する数値コードの組合せとして、プログラムが解析可能なコードの形で格納されています。例えばドル記号($)の場合は「0x24」というコードで格納されています。
NCHAR系のカラム(NCHAR、NVARCHAR2、NCLOB)はデータベースキャラクタセットの設定に関わらず、Unicode文字列を格納する事ができます。ただし、これらのデータ型は「Oracle Text」や「XML DB」などの機能でサポートされない事もあり、やはり「AL32UTF8」が推奨されているようです。
また「シングルバイト・キャラクタセット」⇒「マルチバイト・キャラクタセット」への変換が発生する場合、タイ・アラブ系・中国・日本などの文字などはバイト数が増える可能性があります。漢字の場合はUTF8等で変換すると3バイトや4バイトになるため、カラムが許容するバイト数を拡張しないといけないケースが生じます。
以下にシングル・マルチの例を示します。
(表)
■シングルバイト・キャラクタセット | ■マルチバイト・キャラクタセット | |
(1)キャラクタセットの例 | WE8MSWIN 1252 エンコーディング |
AL32UTF8 エンコーディング |
(2)文字数とバイト数の関係 | 文字数とバイト数が同じ | 文字数とバイト数が異なる場合がある |
(3)損失の可能性 | 文字格納時にデータ損失は発生しない | 文字格納時にデータ損失が発生する可能性がある |
(参考) 文字「€」のバイト列 |
80 | E2 82 AC |
(4-2) データディクショナリーとは?
(5) エラー対応
(5-1) エラー対応1:error while loading shared libraries
別記事「OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法」の5章1節にて記載
(5-2) エラー:Unrecognized convertible data found in scanner result
別記事「OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法」の5章2節にて記載
(5-3) エラー:Sorry only one session is allowed to run this script
別記事「OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法」の5章3節にて記載