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シェープファイルの文字化け問題は解決しませんでした。
次回は、それをどのように解決したかを報告します。