33461


以下のような 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
のときに、期待した結果が得られませんでした。

[code]

    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') || '田');
    
[/code]

最後の INSERT は期待する結果が得られますが、さすがに使えません。  
各国語キャラクタセットはデータベースキャラクタセットから独立しているだろうと考えていたのですが、何か勘違いしているでしょうか？（データベースキャラクタセットを
AL32UTF8 にすると、普通に格納できています）。

どうすれば、データベースキャラクタセットに関わらず各国語キャラクタセットのエンコードで文字列を格納できるのでしょうか。

## 編集

バインド変数を使用した場合について、INSERTしているサンプルコード。

[code]

    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();
    }
    
[/code]

これだと文字化けしてしまう。


CC BY-SA 3.0
2017-02-21T13:46:59.987
32844
2017-03-22T10:36:24.707
2017-03-22T10:31:32.400
20704
20704
question
oracle
OracleでデータベースキャラクタセットがJA16SJISTILDEのとき、NVARCHAR2に  を入れたい


My Oracle Support で問い合わせ、サンプルコードを提示したところ、OracleParameter を使用する回答を得ました。。

[code]

    using (var transaction = connection.BeginTransaction())
    {
        var command = connection.CreateCommand();
        var parameter = (OracleParameter)command.CreateParameter();
        //parameter.DbType = DbType.String;
        parameter.OracleDbType = OracleDbType.NChar;
        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();
    }
    
[/code]

ということで、ADO.NET のクラスでは実現できないという結論に至りました。


CC BY-SA 3.0
2017-03-22T10:36:24.707
33461
2017-03-22T10:36:24.707
20704
32844
answer