OracleXEのキャラクタセット変更

今回は、Dockerコンテナ上のOracle11XEのキャラクタセット(文字コード)を変更したお話です。

必要となった理由

こちらから国勢調査小地域のシェープファイルをダウンロードして、先日構築したOracle11XEにOracle Map Builderを使ってインポートしたところ、日本語が文字化けしていました。
シェープファイルの文字コード(SJIS)が原因と思いクライアント側の環境変数NLS_LANGをSJISやUTF8に設定してみたのですが、状況は変わりません。

もしかしたら、サーバー側のキャラクタセットをSJISにすれば問題ないかも、と思い作業を実施した次第です。

作業手順

Oracle11XEのデータベースについて調べたところ、下記2点がわかりました。

  • Oracle11XEのデータベースのデフォルトのキャラクタセットはUTF8
  • これをSJISに変更するためには、データベースを一旦削除して再作成する必要がある

以下の記事を参考に、キャラクタセットをSJISに変更しました。

https://qiita.com/jsaito/items/33c7b2b5dd80a7447a14

1.オラクルコンテナに接続してデータベースを削除
コンテナ上でbashを起動し、データベースインスタンスを一旦シャットダウンし、マウント状態で再立ち上げ、最後にデータベースを削除してsqlplusを抜けます。黄色下線部はコンテナ名です。

$ docker exec -it oracle bash
 bash-4.2# su oracle
 bash-4.2$ sqlplus / as sysdba
  SQL> shutdown immediate
  SQL> startup restrict mount
  SQL> drop database;
  SQL> quit

コンテナ上でbash起動後、oracleユーザーに変更しますが、このとき”su – oracle”としてしまうとoracleユーザー用の環境変数が再設定されます。しかし、コンテナのoracleユーザーにはオラクル関係のパスや環境変数が一切設定されていません(rootのみに設定、理由は不明)ので、注意してください。

2.データベース作成スクリプトを実行
コンテナからホストに戻り、以下のようにデータベース作成スクリプトを起動します。

$ createdb.sh -dbchar JA16SJIS

なお、createdb.shは、”/u01/app/oracle/product/11.2.0/xe/bin”に存在しています。
20分程度でデータベースの作成が完了します。

3.再度コンテナに接続して確認
再度コンテナに接続し、キャラクタセットを確認します。

SQL> SELECT * FROM nls_database_parameters WHERE parameter = ‘NLS_CHARACTERSET’;
PARAMETER            VALUE
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
NLS_CHARACTERSET   JA16SJIS

4.管理者のパスワードを変更
最後に、管理者(system)のパスワードが変更されていますので、設定しておきます。

SQL> ALTER USER system IDENTIFIED BY password ACCOUNT UNLOCK;

まとめ

キャラクタセットの変更には成功しましたが、本来の目的であるMap Builderから取り込んだSJISシェープファイルの文字化け問題は解決しませんでした。

次回は、それをどのように解決したかを報告します。