I tried to add special symbols (i.e : æ_ø_å_Æ_Ø_Å_____£€$&@%¿) to Oracle database table VARCHAR2 column and different results noticed in following methods.
Database character set : SELECT * FROM nls_database_parameters WHERE parameter LIKE '%SET';
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET WE8MSWIN1252
SQL used :
INSERT INTO Test(C1) VALUES('æ_ø_å_Æ_Ø_Å_____£€$&@%¿');
- Insert Directly via SQL Developer
Result : æ_ø_å_Æ_Ø_Å_____£€$&@%¿
- Insert via SQLPlus
Result : ¿¿_¿¿_¿¿_¿¿_¿¿_¿¿_____¿¿¿¿¿$&@%¿¿
- Insert via C++ code using SOCI library
Result :
While using database connection string (WINDOWS_1252 charset) : "oracle://service=<service> user=<user> password=<password> charset=178 ncharset=1000";
result was
æ_ø_å_Æ_Ø_Å_____£€$&@%¿
While using database connection string (UTF_8 charset) : "oracle://service=<service> user=<user> password=<password> charset=871ncharset=1000";
result was
æ_ø_å_Æ_Ø_Å_____£€$&@%¿
C++ code used :
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;
}
What is the reason for this inconsistent behavior?