C#寫入Oracle 中文亂碼問題


 這個問題是我剛踏入工作覺得最坑的一個問題,找了很多方法、也問過不少人,但還是沒能解決,偶然間返現了新大陸....

具體問題描述是這樣的:

                    我可以讀取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的人物,我希望能同大家一起成長!廢話不多少,學習的點點滴滴,都值得與大家分享!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM