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等解决方案)

 

posted @   Loving伊  阅读(731)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示