C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ODP.NET接続時の文字エンコード変換について


(過去ログ 94 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■55643 / inTopicNo.1)  ODP.NET接続時の文字エンコード変換について
  
□投稿者/ JK (1回)-(2010/12/08(Wed) 10:39:33)

分類:[.NET 全般] 

ここの掲示板を始めて利用させて頂きます。JKと申します。
質問の内容などわかりにくい点などあるかと思いますが宜しくお願い致します。

ASP.NETで作成したアプリケーションからOracle11gサーバーに登録しているデータ参照/編集時の文字列エンコードについてわからないことがあり質問させていただきました。
Oracleとの接続はODP.NETを利用して行っております。
Oracleの経験としてはコマンドやPLSQLなどでテーブルのデータ操作をしたことがある程度で、接続時の動きなどはあまりよくわかっていない初心者です。
おわかりになる方がいらっしゃいましたら、是非ご教示をお願い致します。

-------------------------------------------------------------------
【アプリケーション環境】WindowsXP Ver2002 SP2
フレームワーク : .Netframework2.0-3.5(VS2008)
IIS/ASP.NET : 6.0/2.0.50727
アプリケーション : ASP.NET(VB2008)
Oracleクライアント/ODP.NET  : 11g

【データベースサーバ】Windows Server 2008 R2
Oracleサーバー11gR2
下記の二つのデータベースを用意
 (1)日本語キャラクタセット(JA16SJISTILDE)
 (2)中国語キャラクタセット(ZHS16GBK)

(1)(2)にテーブルを作成
KEY CHAR(8)
DATA CHAR(100)
-------------------------------------------------------------------

【現象】
詳細的な内容としまして、現在はWEBシステムの多国ロケーションを想定した開発の調査として、各キャラクターセットのデータベース(Oracle)を用意し、WEBアプリケーションからユーザーのロケーションにより動的にデータベースの接続したいと思い、色々と検証しています。
※サーバーもクライアントもUTF-8のキャラセットでできればいいと思いますが、既存システムが動いており、改修作業を減らしたい考えがあります。
先ず、クライアントとサーバーのキャラクタセットが異なった場合の文字列レコード参照/編集時の文字化けの確認を行いたく、簡単なアプリケーションを作成してみましたが、期待通りの結果が得られず調査内容で行き詰っております。


アプリケーション環境マシンのOracleクライアントのNLS_LANGの値は*****_*****.ZHS16GBKの設定がしてあります。(*****は日本)
日本語DBのテーブルにはJA16JISTILEDEにしか存在しないような半角カナ文字、カロリーやキロなどの記号文字を登録し、SELECT文でデータを取得します。
SQL*PlusなどでSELECT文を発行した場合は文字化けするのですが、WEBアプリケーションのODP.NET経由で取得した場合では文字化けせずにデータベース値が取得できてしまいます。

ちなみに、SJISでは変換できない(VB側では?で取得)文字を中国語DBに登録した場合で、OracleクライアントのNLS_LANGの値を*****_*****.JA16SJISTILDEに設定した場合も、文字化けを起こさずに出力されます。
※中国語の登録は中国語ロケーション設定をしたPCにて行いました。

【VB側のDEBUGで確認した内容】
Dim ClientGlob As OracleGlobalization = OracleGlobalization.GetClientInfo()
Console.Write(ClientGlob.ClientCharacterSet())
上記により、クライアント・グローバリゼーション設定値の確認では「ZHS16GBK」になっています。

また、接続が確立した後のセッション・グローバリゼーションの設定値も「ZHS16GBK」になっています。
※接続を確立した後にセッション設定情報を変更していないので、クライアント設定値であると判断しています。
Dim oraConn As OracleConnection = New OracleConnection()
oraConn.ConnectionString = "****" '接続文字
oraConn.Open()
Console.Write(oraConn.GetSessionInfo.ClientCharacterSet())
セッション・グローバリゼーションの値はSELECT文の発行の直前と直後で確認しております。


[ASP.NET(VB)]-[ODP.NET]-[OracleClient]-(文字変換)-[OracleServer]
上記のようなアクセスの流れをイメージしておりまして、文字変換部でJA16SJISTILDEとZHS16GBKの文字テーブルを対比してエンコードをしていると思っていたので、文字化けが発生すると期待していたのですが...

【質問】
ODP.NETのコマンド発行(SELECTなど)のタイミングなどでサーバーに適したキャラクターセットでエンコードをしているような動きですが、そういうことはありますか?
NLS_LANGの値の変更は、レジストリの「HKEY_LOCALMACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1」に登録されている値を変更しているのですが、ここではないのでしょうか?
 ※「HKEY_LOCALMACHINE\SOFTWARE\ORACLE\」にもNLS_LANGがあり「NA」になっていました。

根本的にDBへの接続のイメージが違うのかもしれません。
環境の値設定部分などもあわせて、ご教示いただければと思っております。

長文になってしまい申し訳ありませんが、参考になるWEBサイトの文献や情報がありましたら教えてください。

宜しくお願い致します。
引用返信 編集キー/
■55644 / inTopicNo.2)  Re[1]: ODP.NET接続時の文字エンコード変換について
□投稿者/ 甕星 (21回)-(2010/12/08(Wed) 10:59:06)
No55643 (JK さん) に返信
>[ASP.NET(VB)]-[ODP.NET]-[OracleClient]-(文字変換)-[OracleServer]

あってますよ。クライアント側で使っている文字コードから、Oracleサーバーで
使っている文字コードに変換されることになります。Oracleサーバー側でUTF16とか
UTF8辺りの文字コードを使っているなら、ほとんどの国の言語は格納されるでしょう。

クライアント側の文字コードだけではなく、サーバー側の文字コードがどうなっているのか
意識しないする必要があるんじゃない。
引用返信 編集キー/
■55647 / inTopicNo.3)  Re[2]: ODP.NET接続時の文字エンコード変換について
□投稿者/ JK (2回)-(2010/12/08(Wed) 11:43:25)
No55644 (甕星 さん) に返信
> ■No55643 (JK さん) に返信
> >[ASP.NET(VB)]-[ODP.NET]-[OracleClient]-(文字変換)-[OracleServer]
> 
> あってますよ。クライアント側で使っている文字コードから、Oracleサーバーで
> 使っている文字コードに変換されることになります。Oracleサーバー側でUTF16とか
> UTF8辺りの文字コードを使っているなら、ほとんどの国の言語は格納されるでしょう。
> 
> クライアント側の文字コードだけではなく、サーバー側の文字コードがどうなっているのか
> 意識しないする必要があるんじゃない。


早速の返信をありがとうございます。

甕星 さんの内容を元にレコードの追加/編集の動向を確認しました。

【レコードの追加/編集時】
Oracleクライアント側の文字コードをJA16SJISTILDEで、
Oracleサーバー側の文字コードをZHS16GBK(中国語 簡体)で、
サーバー側に日本語の記号文字をINSERT INTOした場合は、
「?」に置き換わって登録が確認されました。

Oracleクライアント側                                         サーバー側
---------------------------------------------------------------------------------------
「カロリー(記号2バイト):0x8769」 → 変換(SJISTILDE-GBK) → 「?:0xA3BF」
※サーバー側はSELECT DUMP(DATA,16)で値を確認しました。

> クライアント側の文字コードだけではなく、サーバー側の文字コードがどうなっているのか
> 意識しないする必要があるんじゃない。
GBK文字テーブルにカロリー記号文字に対応する値が存在しないため「?」に置き換わったという理由で登録されたと思います。
これは期待通りでした。
甕星 さんがおっしゃるとおり、おそらくサーバー側の文字コードをUTF8,16にすれば正常に登録されると思います。
ありがとうございます。

【レコードの参照時】
ここの参照(SELECT)のところが上手く確認できませんでした。

▽期待した結果
Oracleサーバー側                                             クライアント側
---------------------------------------------------------------------------------------
「カロリー(記号2バイト):0x8769」 → 変換(SJISTILDE-GBK) → 「?:0xA3BF」

▽実際の結果
Oracleサーバー側                                             クライアント側
---------------------------------------------------------------------------------------
「カロリー(記号2バイト):0x8769」 → 変換(SJISTILDE-GBK) → 「カロリー(記号2バイト)」化けない...
VB.NETの文字列の内部表記はUFT16であるので、実際にサーバー−クライアント間で変換された文字コード値は確認できませんでした。

サーバー側をUTF8,16あたりに設定するか、型をNCHAR(UTF16)あたりにできればよいのですが、
既存の別システムが存在している環境であるため、データベースの文字コードを変更できません。
UTF8,16キャラクタセットのDBインスタンスとAPPサーバーを新設する理由が欲しく、
「文字化けするからだよ」という調査結果が欲しいです。

自分の環境の設定がおかしいのか、ODP.NETの仕様なのか...
そこらへんの文献を見つけることができずに困っています(汗

引用返信 編集キー/
■56003 / inTopicNo.4)  Re[3]: ODP.NET接続時の文字エンコード変換について
□投稿者/ JK (3回)-(2010/12/22(Wed) 11:33:02)
御回答くださった甕星さん、まことにありがとうございました。

その後の調査の末の判断した結果で解決とさせていただきます。
他にも並行した課題もあった為、ゆっくりとした調査になってしまい解決が中々できませんでした。
※以下の考えであっているのか分かりませんが、、辻褄がなんとなくあったことと、調査期間が迫ってきたので^^;


以前の記述で以下のような流れで文字列データがエンコードされているのでは?と記述しました。
[ASP.NET(VB)]-[ODP.NET]-[OracleClient]-(文字変換)-[OracleServer]

詳細的に調べてみた結果、
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19218-02/ch7progrunicode.htm#i1005929
上記URLのサイトの図より[OracleClient]はOCIという呼び出しのインターフェイス方法(?)でCL-SRV間をやり取りしていることが分かりました。

サイト内の「UTF-8エンコーディーング対応のアプリ(.NetFramework(ODP.NET)-OCIではUnicode、UTF-8対応)では、AL32UTF8を使用してNLS_LANGキャラクタセットに指定する」との記述で、NLS_LANGのレジストリィ値を何に変更してもUTF-8エンコードされ、SELECT時には登録してある文字が文字化けせずに取得できるのではないだろうかと判断しました。
※DBがUTF-8の場合はUTF8を利用する。


以上、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -