主要原因:
Oracle客户端的字符集与服务器端不匹配,需要更改客户端(instant client)或者服务器端的字符集
在SQL Developer中查询服务器端的字符集:
select userenv('language') from dual;
结果:
因此只要在客户端设置同样的字符集即可。
1. 对于Windows,在用户环境变量中设置NLS_LANG变量即可:
2. 对于Linux,在.bash_profile中设置NLS_LANG变量即可:
NLS_LANG = "SIMPLIFIED CHINESE_CHINA.AL32UTF8"
export NLS_LANG
----------------------------------------------------------------------------
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"); 需要注意的是: 第二、三种利用函数进行设置环境变量的操作必须在数据库操作的外边才能生效。 |