以前接觸的都是SQLSERVER數據,現在的公司都用ORCALE,感覺很鬱悶陌生,最近我用程序讀取oracle數據庫中數據時發現中文全部是亂碼。於是我展開了一系列的辦法最終解決了此問題。
工作環境:服務器 windows 2003+ oracle。
服務器字符集 SIMPLIFIED CHINESE_CHINA.WE8DEC。
編程環境 VS2005,C#,PLSQL。
方案一:
利用System.Data.OracleClient.OracleConnection類訪問數據庫。
連接字符串: "Data Source= (DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.0.5)(PORT = 1521)))(CONNECT_DATA = (SID = DEV))) ;User Id=lswen;Password=1169"
將本地字符集改爲與服務器相同。
打開註冊表regdit:HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOMEO 中NLS_LANG改爲: SIMPLIFIED CHINESE_CHINA.WE8DEC。
這個方法簡直就像噩夢,根本解決不了,網上有很多人發表用這種方法。答案是片面的,如果服務器的字符集是: ZHS16GBK那麼此法就可以解決。字符集WE8DEC是西歐字符集本身包含的漢字就不多,之所以它允許用存入漢字是因爲它將一個漢字拆分爲兩個字節存儲方式,其他中文字符集的客戶端無法直接還原爲一箇中文。所以必須保持客戶端與服務器一致-----這網上看到的不知道自己的理解是否對。
方案一 失敗。
方案二 :
利用System.Data.OleDb.OdbcConnection類訪問數據庫。
連接字符串:"Provider=MSDAORA.1;Data Source=(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.0.5)(PORT = 1521)))(CONNECT_DATA = (SID = DEV))) ;User Id=lswen;Password=1169"
將本地字符集改爲與服務器相同,方法同方案一相同。
這一下問題終於解決了。
強調連接字符串因該使用Provider=MSDAORA.1; 不能使用Provider=oraoledb.oracle;
方案二 成功了。
總結 :
不管是WE8DEC,還是其他一些西歐字符集都存在這樣的問題,用第二種方案應該都可以解決。
以上內容經過參考,有不嚴謹或者錯誤的理解某些概念的地方請高手指正。