以下の話は、パターンBを採用した時の話です。
OracleでJIS2004対応をするには、どうしたら良いのかがわからず、ここ1週間ほど時間を見つけて調査をしてきた。会社の環境が貧弱なので、自宅マシーンで評価しようとしてOracleインストールに失敗して、ついかっとなりOS再インストールとかしたりした。おかげでWin7 の64ビットデビューしちゃったよ。
まぁ前起きはこれぐらいにして、本題。「Oracle JIS2004 対応方法」とかで検索すると参考にて提示したリンクが出てきてなーんとなくは理解できるのだが決定的な理解に至らず、悶えた。実機で評価し、ようやく理解できた。
追記(2010/06/20):AP周りで考慮すべきことが残っていたので「Oracle JIS2004対応(AP周り) – 戦艦ゆにっき」に追記。
JIS X 0213:2004のデータをDBに格納する方法
- Oracle Database 10g Release 1(10.1.0)以降のAL32UTF8キャラクタ・セットまたはAL16UTF16各言語キャラクタ・セットのデータベースを利用する。
- DBアクセス製品に応じてUnicodeを利用したプログラミングを行う
- 開発環境、実行環境がJIS X 0213:2004のデータを取り扱える必要がある
DB周りの補足
上記1がわかりずらい。また検索するとサイトによって記載がぶれていて、本当にあっているのかどうかがわかりにくい。(特に各言語キャラクタ・セットの意味を知らなかったら・・・・)
Oracle DatabaseでJIS2004を扱う為の設定は2種類存在し、どちらかを選択することになる。
- DBのキャラクタ・セットをAL32UTF8にする。
- DBのキャラクタ・セットはJA16SJISTILDEにしたまま、AL16UTF16各言語キャラクタ・セットにする。そして、JIS2004を格納したいカラムのデータ型をnvarchar2などの「n~型」を使用し、Unicodeを扱える環境で文字登録すれば良い。
- NLS_NCHAR_CHARACTERSETをAL16UTF16にする
どちらかで対応すれば良い。たとえば、カラム名に日本語を使っていたりして、DBのキャラクタ・セットを変更したくない場合は、後者を選択することになる。
文字を登録するクライアントについて
JIS2004で拡張された文字を本当に登録できているかを確認するためには、クライアントがJIS2004を扱えなければならない。
自分で調べた範囲では、sql*plusではJIS2004拡張文字は扱えない。なので、SQL Developer(Oracle標準のツール)などを使ってあげる必要がある。
評価結果
評価は、DBキャラクタセットはJISで、各言語セットをUTFで行った。
NAME0はVARCHAR、NAME1はNVARCHAR、NAME2はNCHARのデータ型という構造の表に下のようなSQLを発行しコミットする。挿入したデータは、それぞれ「VistaとXPでフォントの形状が異なる」「XPに対応するフォントが無い文字」「XPに対応するフォントが無いサロゲート・ペア文字」である。
すると結果は、下のようになる。
Windows 7にインストールしたOracleにWindows 7上のSQL DeveloperからINSERTした結果である。Windows 7環境でも、N~型ではないNAME0は文字化けしていることを確認できる。
ちなみに参考資料によると、JA16SJISTILDEに格納できない文字を格納しようとしたので「?」として格納される。そして、サロゲート・ペア文字は二文字の「??」として格納される。これを通常のXPで参照すると「・」と文字化けするらしい・・・。