2

特殊記号 (例: æ_ø_å_Æ_Ø_Å_____£€$&@%¿) を Oracle データベース テーブルの VARCHAR2 列に追加しようとしましたが、次の方法で異なる結果に気付きました。

データベース文字セット: SELECT * FROM nls_database_parameters WHERE parameter LIKE '%SET'; NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_CHARACTERSET WE8MSWIN1252

使用される SQL :

INSERT INTO Test(C1) VALUES('æ_ø_å_Æ_Ø_Å_____£€$&@%¿');
  1. SQL Developer経由で直接挿入

結果 : æ_ø_å_Æ_Ø_Å_____£€$&@%¿

  1. SQLPlus 経由で挿入

結果 : ¿¿_¿¿_¿¿_¿¿_¿¿_¿¿_____¿¿¿¿¿$&@%¿¿

  1. SOCI ライブラリを使用して C++ コード経由で挿入

結果: データベース接続文字列 (WINDOWS_1252 文字セット) を使用中:"oracle://service=<service> user=<user> password=<password> charset=178 ncharset=1000";結果は æ_ø_Ã¥_Æ_Ø_Ã…_____£€$&@%¿

データベース接続文字列 (UTF_8 文字セット) の使用中:"oracle://service=<service> user=<user> password=<password> charset=871ncharset=1000";結果は æ_ø_å_Æ_Ø_Å_____£€$&@%¿ C++ コードが使用されました:

std::string dbConnectionString = "oracle://service=<service> user=<user> password=<password> charset=178 ncharset=1000";
soci::session dbCon;
dbCon.open(dbConnectionString.c_str());
soci::statement *cursor = nullptr;
std::string selectString ="INSERT INTO Test(C1) VALUES('æ_ø_å_Æ_Ø_Å_____£€$&@%¿')";

try
{
    cursor = new soci::statement(dbCon);
    cursor ->alloc();
    cursor ->prepare(selectString);
    cursor ->define_and_bind();
    cursor ->execute(true);
}
catch (soci::soci_error const & e)
{
    std::cout <<"ERROR :  ." << e.get_error_category() << " : "<<e.what()<<  std::endl;
}

この一貫性のない動作の理由は何ですか?

4

0 に答える 0