■文字化けするはずなのに・・・
先日、仕事中にある奇妙なことに気が付きました。
新しく構築した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;
・実行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)
<表示結果>
SEQ | C1 | CODE |
---|---|---|
1 | - | \2212 |
2 | - | \FF0D |
○パターン3 ODBC(Microsft ODBC for Oracle)
<表示結果>
SEQ | C1 | CODE |
---|---|---|
1 | ? | ? |
2 | - | \FF0D |
○パターン4 JDBC(Thin)
<表示結果>
SEQ | C1 | CODE |
---|---|---|
1 | ? | \2212 |
2 | - | \FF0D |
○パターン5 JDBC(OCI)
<表示結果>
SEQ
|
C1
|
CODE
|
---|---|---|
1
|
?
|
\2212
|
2
|
-
|
\FF0D
|
というわけで今までの検証結果からすると、
Oracle Client (=OracleNetServices?)が関わると"-"(全角マイナス)は表示されているので、
Oracleさんが何か内部的に変換かけてくれていると思われます。
(ただその前提だと、JDBC(OCI)も化けないでほしいのですが・・・)
ただこのあたりの情報がネットを漁っても出てこないので、根本的に間違っている可能性も無きにしも非ずです。
もう少し検証しようと思います。
Oracleさんが何か内部的に変換かけてくれていると思われます。
(ただその前提だと、JDBC(OCI)も化けないでほしいのですが・・・)
ただこのあたりの情報がネットを漁っても出てこないので、根本的に間違っている可能性も無きにしも非ずです。
もう少し検証しようと思います。
0 件のコメント:
コメントを投稿