OracleでデータベースキャラクタセットがJA16SJISTILDEのとき、NVARCHAR2に を入れたい
以下のような Oracle の環境を用いて、 NVARCHAR2 に「」を入れようとしていますが、どうしてか文字化けしてしまいます。
- サーバー : Oracle Database 11.2.0.4 (64bit) (ホストOS:Windows7 64bit)
- クライアントライブラリ : Oracle.ManagedDataAccess 4.121.2.0
- クライアントPC : Windows 7 (64bit)
- データベースキャラクタセット : JA16SJISTILDE
- 各国語キャラクタセット : AL16UTF16
- NLS_LANG : JAPANESE_JAPAN.JA16SJISTILDE (Oracle ManagedDataAccess では NLS_LANG を設定できないので無関係だとは思いますが)
各国語キャラクタセットに設定されたエンコーディングで文字列を格納できると考えているのですが、データベースキャラクタセットが JA16SJISTILDE のときに、期待した結果が得られませんでした。
CREATE TABLE NVARCHAR_TEST (
NAME NVARCHAR2(32)
);
INSERT INTO NVARCHAR_TEST VALUES ('田');
INSERT INTO NVARCHAR_TEST VALUES (N'田');
INSERT INTO NVARCHAR_TEST VALUES (UNISTR('\D842\DFB7') || '田');
最後の INSERT は期待する結果が得られますが、さすがに使えません。
各国語キャラクタセットはデータベースキャラクタセットから独立しているだろうと考えていたのですが、何か勘違いしているでしょうか?(データベースキャラクタセットを AL32UTF8 にすると、普通に格納できています)。
どうすれば、データベースキャラクタセットに関わらず各国語キャラクタセットのエンコードで文字列を格納できるのでしょうか。
編集
バインド変数を使用した場合について、INSERTしているサンプルコード。
using (var transaction = connection.BeginTransaction())
{
var command = connection.CreateCommand();
var parameter = command.CreateParameter();
parameter.DbType = DbType.String;
parameter.ParameterName = "name";
parameter.Direction = ParameterDirection.Input;
parameter.Value = "田";
command.Parameters.Add(parameter);
command.CommandText = @"INSERT INTO NVARCHAR_TEST VALUES (:name)";
command.ExecuteNonQuery();
transaction.Commit();
}
これだと文字化けしてしまう。