C#程序写入oracle英文集库乱码的解决方案
DB常用的两种字符集:
英文:SIMPLIFIED CHINESE_CHINA.US7ASCII
中文:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
中文字符集一般用oracle相关驱动读写是正常的,当DB的字符集是英文集:SIMPLIFIED CHINESE_CHINA.US7ASCII的时候会存在中文写入乱码(????)的问题。具体原因如下:
1.确认客户端和服务端的字符集一致。服务端字符集的查看:select userenv('language') from dual;在注册表中可以修改其字符集。客户端字符集的查看和修改在环境变量中
NLS_LANG:SIMPLIFIED CHINESE_CHINA.US7ASCII
NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
如果服务端和客户端字符集不一致在plsql等工具中就会出现中文乱码的情况。
2.DB字符集为英文字符集时,C#程序一般用OLEDB连接去访问数据库,这里涉及到两个驱动:
一个是由微软提供provider=MSDAORA.1(MSDAORA)驱动,由于其只支持32位的客户端,具有一定的局限性,要求服务器必须部署oracle32位的客户端才可以正常访问,
尤其要注意的是服务器通常会装载多个oracel客户端,一定程度上会对程序访问数据库形成干扰,因此建议一台服务器只安装一个32位oracle客户端,如果多装的话,环境变量中
只保留一个oracle_home(即应用程序想要访问的那一个oracle_home)。这个驱动读写中英文库支持效果很稳定。还有就是客户端32位与服务端64位是可以并存的。
另一个是provider=OraOLEDB.Oracle是Oracle自带的驱动,对中文字符集(ZHS16GBK)支持很好,对英文字符集(US7ASCII)数据读取无乱码,写入有乱码,并且做为
where条件传进去的中文参数为乱码,优点就是与操作系统位数无关。
连接字符串:
Provider=MSDAORA;Data Source=192.168.19.199/ANESV4EN;Password=medcomm;User ID=medcomm;
Provider=OraOLEDB.Oracle;Data Source=192.168.19.199/ANESV4EN;Password=medcomm;User ID=medcomm;
注意点:1.修改环境变量和注册表记得重启服务器
2.客户端驱动不处理好,改变访问方式无法解决乱码问题(亲测过无需安装客户端和NLSQL等解决方案)

浙公网安备 33010602011771号