主要原因:
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");
需要注意的是: 第二、三種利用函數進行設置環境變量的操作必須在數據庫操作的外邊才能生效。