Oracle JIS2004対応(AP周り)

投稿者: | 9月 21, 2011

SQL DeveloperのGUIからJIS2004文字を登録でき、参照もできたから問題無いと判断していた。アプリ側に対応の必要無しっと言う記述を目にしていたので、余計思い込んだ。

ひょっとしたら、ほかに何らかの対応で回避できるのかもしれないが自分が調べた範囲では不明。ともかく、ここ数日20時間を費やして判明したことをメモっておく。尚、使用しているのはODP.NETである。

パラメータライズクエリ

一つ目の対応方法は、パラメータライズクエリを利用することである。

Using conn As New OracleConnection
    'データベースへの接続を開く
    conn.ConnectionString = "User Id=sys;Password=oracle;Data Source=PooP;DBA Privilege=SYSDBA"
    conn.Open()
    Dim cmd As New OracleCommand
    cmd.Connection = conn
    cmd.CommandText = "INSERT INTO SYS.TEST (NAME1,NAME2) VALUES (:nora,:nora2)"
    'BindByName
    cmd.BindByName = True
    'Parameters.Add
    cmd.Parameters.Add("nora", OracleDbType.NVarchar2, 30).Value = "㐂"
    cmd.Parameters.Add("nora2", OracleDbType.NChar, 30).Value = "㐂"
    Dim rows As Decimal = cmd.ExecuteNonQuery()
    Debug.Print(rows.ToString() + " 行更新しました。")
End Using

パラメータライズクエリでパラメータを指定する際に、「Parameters.Add」でデータ型を指定すると正常に挿入することができた。挿入した文字は、「㐂」です。七が3つで作成された「よろこぶ」と言う文字。

N関数を使用する

UNICODE対応する時には、N関数(N'hogehoge’ みたいなの)を使用すれば良いというのは有名なので、それで対応しようとした。

cmd.CommandText = "INSERT INTO SYS.TEST (NAME1,NAME2) VALUES (N'㐂',N'㐂')"

上記のように変更したが、文字化けする。

解決するには、環境変数「ORA_NCHAR_LITERAL_REPLACE」を「TRUE」に設定してあげる必要がある。環境変数を設定することで文字化けが解消された!!!

レジストリで設定することも可能なようだが、どのキーを設定すればいいのかがわからない、各クライアントのレジストリの設定を変更する運用は考えられないので、以下のコードで対応。

System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE")

N関数(N引用符)

Oracle Database では、N 引用符付きのテキストは、データベース・キャラクタ・セットを

使用して各国語キャラクタ・セットに変換されます。クライアント側キャラクタに対応す

るエンコーディングがデータベース・キャラクタ・セットにない場合、Oracle Database で

は疑問符に変換されます。

ORA_NCHAR_LITERAL_REPLACE

Oracle Databaseアプリケーション開発ガイド・基礎編」より抜粋

テキスト・リテラル変換中の潜在的なデータ消失を回避するに

は、$ORA_NCHAR_LITERAL_REPLACE 環境変数をTRUE に設定します。この設定により、

N'text' が内部で透過的に置き換えられ、テキスト・リテラルがSQL 処理のために保持

されます。

補足

SQL Developerのクエリエディタからでは、どうやっても成功せず文字化け(「?」)になってしまった。ひょっとすると、レジストリで「ORA_NCHAR_LITERAL_REPLACE」を設定すれば解決するのかもしればいが、調査はしていない。

参考

Oracle Technology Network (OTN) Japan – 掲示板 : 中国語のINSERTがうまくいきません。 …」が二つ目の解決策の決め手でした。環境変数が必要なんて夢にも思わないw

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください