技術ブログ
Oracle Database は12c(12.1.0.1) よりUnicode 6.1に対応しています。日本における「文字」を考えると、Unicode 6.xにおける大きなトピックはいわゆる「顔文字」、Emoticons になるでしょうか。
というわけで動作を確認してみます。
Emoticonsに対応するコードポイントの範囲は、U+1F600からU+1F64Fです。 サロゲートペアを用いたUTF-16で表記すると0xD83D 0xDE00から0xD83D 0xDE4Fとなります。
コードポイント サロゲートペア(UTF-16) UTF-8 --------------- ------------------------- -------------------- 1F600 0xD83D 0xDE00 0xF0 0x9F 0x98 0x80 1F64F 0xD83D 0xDE4F 0xF0 0x9F 0x99 0x8F
Locale BuilderでAL32UTF8を開き、AL32UTF8のキャラクタセット定義を確認します。
分類が"PUNCTUATION" = 句読点 となっているのが気になりますが・・・。 一応、キャラクタセット定義には含まれているようです。
データベースキャラクタセットAL32UTF8のデータベース(Oracle Database 12.1.0.1) にデータをINSERTします。データは笑っている表情の顔文字とします。
コードポイント サロゲートペア UTF-8 --------------- ----------------- -------------------- 笑 U+1F604 0xD83D 0xDE04 0xF0 0x9F 0x98 0x84
JIS X 0208 (JIS基本漢字) 以外の文字をOracle DatabaseにINSERTする場合は、unistr()を使用するのが、無用なトラブルを避けられるので便利です。
SQL> create table tab1 (i number, c varchar(80)); 表が作成されました。 SQL> insert into tab1 values (1,unistr('\D83D\DE04')); 1行が作成されました。 SQL> commit; コミットが完了しました。 SQL> SELECT i, dump(c,17) FROM tab1; I ---------- DUMP(C,17) ------------------------------------------------------------------------------------------------------------------------ 1 Typ=1 Len=4: f0,9f,98,84
dump()の結果より、想定したUTF-8のバイト表現でデータが格納されていることがわかります。
INSERTしたデータを確認します。
ツール、フォントなどがUnicode 6.0に対応していないと、適切に表示されません。
ツールは、Unicodeに対応しているSQL Developerを使用します。 JDKは、おそらくUnicode 6.0に対応しているJDK 7以降が良いはずです。
フォントは、VLゴシックを使用しました。 OS(Windows 7) にVLゴシック フォントをインストールしてから、SQL Developerの プリファレンスで表示用のフォントにVLゴシックを選択します。
確かに笑っている表情の顔文字が表示されています!めでたしめでたし
原因まで追い切れていないのですが、いくつか表示できないケースがあったので共有しておきます。
フォントに和田研フォントを指定した場合、'・'のような文字が表示され、適切に表示されませんでした。和田研フォントのEmoticonsサポートに癖があるのかもしれません。
SQL*Plusでデータを確認しても'?'となり表示できません。フォントをVLゴシックや和田研フォントを使用してもNGでした。もしかするとターミナルエミュレータ(Tera Term)の問題かもしれません。
SQL> SELECT c FROM tab1; C -------------------------------------------------------------------------------- ?
2014/3/7追記: http://ttssh2.sourceforge.jp/manual/ja/usage/unicode.html "UTF-8は3バイトまでしか変換していない" とあるので、Tera TermはUnicodeのBMP範囲内のみの限定対応のようです。EmoticonsはBMP範囲外なので、上記の動作は想定されるものですね。