Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

OracleDB

OracleDB11gのキャラクタセットを変更する手順について(概要編)

投稿日:2020年4月1日 更新日:

(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) 上記の禁止事項を踏まえての方針
①12c以降の場合
基本はDMUツール(Database Migration Assistant for Unicode)を利用します。

 

②10g/11gの場合
やり方が大きく2つあります。
1)1つ目がCSALTERというPL/SQLのモジュールを使用します。実態は「csalter.plb」というPL/SQLファイルをラップしたモジュールになっています。
2)2つ目がエクスポート・ユーティリティとインポート・ユーティリティを使う方法です。
本記事では1つ目の「CSALTER」の方法に焦点を当てて記述します。

目次にもどる

(2) キャラクタセット変更手順

別記事「OracleDB11gのキャラクタセットを変更する手順について(手順編)」の2章にて記載

(3) 失敗した場合の対応

別記事「OracleDB11gのキャラクタセットを変更する手順について(手順編)」の3章にて記載

目次にもどる

(4) 用語説明

(4-1) キャラクタセットとは?

CHAR型・CLOB型・VARCHAR型のデータや各種メタデータ(テーブル名・カラム名やSQL文など)で利用される「エンコーディング方式」を指定する値です。DBに文字列を格納する際は、文字列がそのまま格納される訳ではなく、実際は文字に対応する数値コードの組合せとして、プログラムが解析可能なコードの形で格納されています。例えばドル記号($)の場合は「0x24」というコードで格納されています。

<参考>

 

OracleではUnicodeが世界各国の言語を幅広くカバーしている事から、データベースのキャラクタセットとして「AL32UTF8」を推奨しています。ちなみに代表的なキャラクタセットは下記の通りです。

 

①AL32UTF8
“UTF-8″方式によるエンコーディングで最新のUnicodeをサポートしており、文字を1~4バイトにエンコードします。補助文字(Supplementary Characters)は4バイトが必要となります。またXML型のデータにも対応している。

 

②UTF8
“CESU-8″方式によるエンコーディングで最新のUnicodeをサポートしており、文字を1~3バイトにエンコードします。非常に紛らわしいですが、名前にハイフン”-“がない上にエンコーディングも”UTF-8″ではない点が注意が必要です。補助文字は2つの3バイトコードに変換されるため、合計で6バイト消費します。また”UTF8″はUnicode標準の3.0以上を保証していない事やXML型のデータに対応していない事情もあり、Oracleでは「AL32UTF8」を利用する事を強く推奨しています(基本的には「AL32UTF8」を使う)。

 

③AL16UTF16
NCHAR系のデータ型用(NCHAR、NVARCHAR2、NCLOB)。

 

<参考>

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) データディクショナリーとは?

OracleDB内の全てのオブジェクトの名前や属性が格納されているビューです。テーブルやビューなどのオブジェクトを作成すると、Oracleがその変更を自動で取り込み・反映してくれます。実際のテーブルはSYSTEM表領域に格納されていますが、通常のユーザーは表を直接に照会せず、基本はビュー経由で確認します。例えば「ALL_TAB_COLS」は全テーブル・全カラムの情報を保持しています。

 

ビューの頭には「DBA_」や「ALL_」や「USER_」などの接頭辞が付与されており、アクセスできるユーザの種類を表しています。

目次にもどる

(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節にて記載

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-OracleDB

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

OracleDB11g で新規表領域とスキーマの作成

(0) 目次 (1) 表領域の作成 (2) スキーマの作成 (3) スキーマの接続権限を付与 (4) 用語解説 (1) 表領域の作成 表領域とデータベースファイル(dbf)を以下のコマンドで作成します …

Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その3)

目次 (5)リスナーの作成(netca)  (5-0)リスナーについての概要  (5-1)netcaの起動(netca)  (5-2)リスナー設定  (5-3)リスナー名の設定  (5-4)リスナーの …

SQLでCASE文の結果をWHERE句に指定する方法およびコスト面の考察

本記事では、 ・SQLでCASE文の結果をWHERE句に指定する方法について記述します。 ・CASE文を使う場合のコストについて考察します。 (0)目次&概説 (1) NG例 (2) OK例&解説 ( …

ORA-00257エラーの対応(“archiver error. Connect Internal only. until freed”)

ORA-00257エラーの対応法についてです。 (“archiver error. Connect Internal only, until freed”) (0) 目次 (1 …

Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その4)

掲題の通り、LinuxにOracleDB(11g)をインストールする方法について書きます。 「(その3)」の続編記事です。 https://rainbow-engine.com/2017/05/05/ …

  • English (United States)
  • 日本語
Top