首页 > 解决方案 > 无法将特殊符号插入 Oracle 数据库

问题描述

我尝试在 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;
}

这种不一致行为的原因是什么?

标签: c++databaseoraclesoci

解决方案


推荐阅读