Невозможно вставить специальные символы в базу данных Oracle - PullRequest
2 голосов
/ 19 февраля 2020

Я попытался добавить специальные символы (то есть: æ_ø_å_Æ_Ø_Å _____ £ € $ & @% ¿) к 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 Разработчик

Результат: æ_ø_å_Æ_Ø_Å_____£€$&@%¿

Вставка через SQLPlus

Результат: ¿¿_¿¿_¿¿_¿¿_¿¿_¿¿_____¿¿¿¿¿$&@%¿¿

Вставка через код C ++ с использованием библиотеки SOCI

Результат: При использовании строки подключения к базе данных (кодировка 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;
}

В чем причина этого противоречивое поведение?

...