c++ - 无法将特殊符号插入 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('æ_ø_å_Æ_Ø_Å_____£€$&@%¿');
- 通过 SQL Developer 直接插入
结果 : æ_ø_å_Æ_Ø_Å_____£€$&@%¿
- 通过 SQLPlus 插入
结果 : ¿¿_¿¿_¿¿_¿¿_¿¿_¿¿_____¿¿¿¿¿$&@%¿¿
- 使用 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;
}
这种不一致行为的原因是什么?
解决方案
推荐阅读
- python - 为什么 Selenium 在滚动时不抓取所有数据?
- r - 结果-feeding rolling window or rollapply with cumsum
- linux - whoami 命令在 jenkins cli 和 linux cli 中显示不同的用户名,尽管工作区 i
- path - 树 k 长度,更少的节点
- python - python请求('SSL例程','tls_process_server_certificate','证书验证失败')
- python - 更改 kivymd 的 MDBottomNavigation 中的默认选项卡
- php - 使用 firestore PHP 检索我收藏的所有文档
- angular - mat-table 排序不适用于对象路径键
- java - 如何为 springdoc-openapi 端点调用添加带有授权的标头
- haskell - 为什么 Haskell 递归地导入实例?为什么不只从指定模块导入所有实例?