这个问题是我刚踏入工作觉得最坑的一个问题,找了很多方法、也问过不少人,但还是没能解决,偶然间返现了新大陆....
具体问题描述是这样的:
我可以读取Oracle数据库中已有的中文内容,并能正确显示(Oracle中的中文通过SQLplus录入),但当我使用C#程序插入中文记录时,发现数据库中显示为乱码,读取出来也为乱码。我试了很多种编码方式,问题都不能解决。
以下是查找相关资料得到的解决办法:
主要问题是: oracle客户端软件的字符编码与服务器端的字符编码不一致造成的。
oracle的字符编码为 ZHS16GBK
C#中Encoding.Default为"GB2312"
oracle服务端字符编码为: ZHS16GBK
oracle客户端字符编码为: WE8ISO8859P1
解决办法有三种:
(1)修改客户端注册表: 找到Oracle安装注册项下的NLS_LANG,将其值改为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK
(2)通过调用_putenv函数,在程序中用代码设置:
using System.Runtime.InteropServices;
...
[DllImport("msvcrt.dll")]
private static extern int _putenv(string str);
...
_putenv("NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK");
//数据库操作
_putenv("NLS_LANG = AMERICAN_AMRICA.WE8ISO8859P1");
(3)通过C#自带的函数设置环境变量
System.Environment.SetEnvironmentVarible("NLS_LANG "," SIMPLIFIED CHINESE_CHINA.ZHS16GBK");
//数据库操作
System.Environment.SetEnvironmentVarible("NLS_LANG ","AMERICAN_AMRICA.WE8ISO8859P1");
需要注意的是: 第二、三种利用函数进行设置环境变量的操作必须在数据库操作的外边才能生效。
发现参加工作之后,自己慢慢的喜欢上了博客园,隔几天就习惯性都进去看一看,看到对自己有帮助的就立马给收藏了,碰到有疑问的也会大胆的提出质疑,这里真的是个好平台,是程序员
的又一个施展空间。在这可以碰到很多的大神、屌丝或牛B的人物,我希望能同大家一起成长!废话不多少,学习的点点滴滴,都值得与大家分享!
C#写入Oracle 中文乱码问题