2013/06/22

Oracleで"-"(全角マイナス)が文字化けしない!?

■文字化けするはずなのに・・・

先日、仕事中にある奇妙なことに気が付きました。
新しく構築したOracle DatabaseのキャラクタセットをUTF-8にしてみて、
いろいろ検証していたところ、
「文字化けするだろう」と思っていた全角記号が文字化けしないのです!

例えば"-"(全角マイナス)です。

① MS932 を Unicodeに変換
      817C → FF0D 

② SJIS を Unicodeに変換
      817C  →  2212

このマッピングの違いによって、Javaプログラムなどで文字化けする問題が発生します。

UTF-8のDBなので、②の変換によって登録された"-"(全角マイナス)は、
Windowsでは文字化けしてしまうだろう(※)と思ったのですが、
SQL*PLUSで確認すると正しく表示されてしまうのです。

※2212にあたる文字がMS932には無い為

そこで次のような検証をしてみました。



◆表示検証◆

◇環境
 クライアント
   Windows7(MS932)
   Oracle Client9i
   NLS_LANG=JAPANESE.JAPAN.JA16SJIS

 DB
   Oracle Databese XE 11g(UTF-8)


◇検証内容
(1)UTF-8のDBに上記①②の2種類で変換した"-"(全角マイナス)のデータを用意
(2)色々な方法でSELECTして表示してみる

・実行SQL
select SEQ,C1,asciistr(C1) as CODE from test_table;
 

○パターン1 SQL*PLUS

<表示結果>
  SEQ C1  CODE
  --- ---- ----------------
  1    -    \2212
  2    -    \FF0D


○パターン2 ODBC(Oracle Client)

<表示結果>
SEQC1CODE
1\2212
2\FF0D


○パターン3 ODBC(Microsft ODBC for Oracle)

<表示結果>
SEQC1CODE
1??
2\FF0D


○パターン4 JDBC(Thin)

<表示結果>
SEQC1CODE
1?\2212
2\FF0D


○パターン5 JDBC(OCI)

<表示結果>
SEQ
C1
CODE
1
?
\2212
2
\FF0D



というわけで今までの検証結果からすると、
Oracle Client (=OracleNetServices?)が関わると"-"(全角マイナス)は表示されているので、
Oracleさんが何か内部的に変換かけてくれていると思われます。
(ただその前提だと、JDBC(OCI)も化けないでほしいのですが・・・)

ただこのあたりの情報がネットを漁っても出てこないので、根本的に間違っている可能性も無きにしも非ずです。

もう少し検証しようと思います。

0 件のコメント:

コメントを投稿