问题
通过C++ OTL组件访问Oracle数据库,查询出来的中文是???,这种形式,并不是乱码,数据库存储的数据是utf8编码,通过sqlplus或者navicat查询数据能够正确显示,通过C++代码查询不正确
1.查看服务器端编码
通过在服务器上运行sqlplus登陆数据库执行查询:
select userenv('language') from dual;
查询结果:
SIMPLIFIED Chinese_CHINA.ZHS16GBK
2查看客户端访问编码
通过在客户端机器运行Navicat,执行查询
select * from V$NLS_PARAMETERS
查询结果
NLS_LANGUAGE:AMERICAN
解决方案
3.在客户端机器设置环境变量
计算机->属性->高级系统设置->环境变量->新建
设置变量名:NLS_LANG,变量值:第1步查到的值(SIMPLIFIED Chinese_CHINA.ZHS16GBK)
注意:重启电脑
原理
NLS_CHARACTERSET 为server端字符集
NLS_LANGUAGE 为 server端字符显示形式