fyi
由於歷史的原因,早期的oracle沒有中文字符集(如oracle6、oracle7、oracle7.1),但有的使用者從那時起就使用資料庫了, 並用us7ascii字符集儲存了中文,或是有的使用者在建立資料庫時,不考慮清楚,隨意選擇乙個預設的字符集,如we8iso8859p1或us7ascii,而這兩個字符集都沒有漢字編碼,雖然有些時候選用這種字符集好象也能正常使用,但用這種字符集儲存漢字資訊從原則上說就是錯誤的,它會給資料庫的使用與維護帶來一系列的麻煩。正常情況下,要將漢字存入資料庫,資料庫字符集必須支援中文,而將資料庫字符集設定為us7ascii等單位元組字符集是不合適的。us7ascii字符集只定義了128個符號,並不支援漢字。另外,如果在sql*plus中能夠輸入中文,作業系統預設應該是支援中文的,但如果在nls_lang中的字符集設定為us7ascii,顯然也是不正確的,它沒有反映客戶端的實際情況。但在實際應用中漢字顯示卻是正確的,這主要是因為oracle檢查資料庫與客戶端的字符集設定是同樣的,那麼資料在客戶與資料庫之間的訪問過程中將不發生任何轉換,但是這實際上導致了資料庫標識的字符集與實際存入的內容是不相符的。而在select的過程中,oracle同樣檢查發現資料庫與客戶端的字符集設定是相同的,所以它也將存入的內容原封不動地傳送到客戶端,而客戶端作業系統識別出這是漢字編碼所以能夠正確顯示。
在這個例子中,資料庫與客戶端都沒有設定成中文字符集,但卻能正常顯示中文,從應用的角度看好象沒問題。然而這裡面卻存在著極大的隱患,比如在應用length或substr等字串函式時,就可能得到意外的結果。
對於早期使用us7ascii字符集資料庫的資料遷移到oracle8i/9i中(使用zhs16gbk),由於原始資料已經按照us7ascii格式儲存,對於這種情況,可以通過使用oracle8i的匯出工具,設定匯出字符集為us7ascii,匯出後使用ultraedit等工具開啟dmp檔案,修改第
二、三字元,修改 0001 為0354,這樣就可以將us7ascii字符集的資料正確匯入到zhs16gbk的資料庫中。
總結一下在 .net 中讀寫oracle資料庫常用兩種方式:oracleclient和oledb,其中oledb的方式根據驅動程式的不同又有兩種。
1. oracleclient方式,是微軟專門針對oracle資料庫開發的,僅在 .net framework 1.1 版中受支援。據說速度快、效能好,是推薦使用的方式。但根據我的經驗,當oracle資料庫伺服器端採用英文字符集比如 us7ascii 時,客戶端不管字符集如何設定,讀出的中文都是亂碼;若伺服器端用中文字符集比如 zhs16gbk ,則無亂碼問題。
引用類庫:system.data.oracleclient.dll。
命名空間:system.data.oracleclient。
常用類:oracleconnection、oraclecommand、oracledataadapter、oracletransaction、oracledatareader等。
典型連線字串:「data source=oratest;user id=scott;password=tiger」(注意:可不指定 provider 驅動)。
2. oledb方式,微軟和oracle公司各自提供了oledb的驅動程式,使用方法的差別很少。不管oracle伺服器端用何字符集,讀寫中文均無亂碼問題。
相同之處
命名空間:system.data.oledb。
常用類:oledbconnection、oledbcommand、oledbdataadapter、oledbtransaction、oledbdatareader等。
不同之處
引用類庫:微軟的只需要system.data.dll;若用oracle的驅動,雖然也只要引入system.data.dll,但前提是首先安裝oracle針對.net的資料訪問元件。
連線字串:與oracleclient方式相比,要新增乙個provider,微軟為「provider=msdaora.1;」,oracle為「provider='oraoledb.oracle';」。
set conn=server.createobject("adodb.connection")
注意下面一行:在web.config中加入即可,只需更改資料庫連線引數,還要安裝oracle客戶端,我已測試過,可以正常顯示漢字
dns="provider=msdaora.1;persist security info=true;user id=user1;password=pass1;data source=oradb"
Oracle解決中文亂碼
經過一番查證,發現問題的源頭不是出現在plsql上,而是出現在我們的oracle上,由於我們的oracle資料庫裡的字符集不支援中文導致的,既然知道了原因,就好辦了,我們就配置我們的oracle字符集,讓他支援中文。我的oracle是11g版本的,下面以我的為例,為大家講解下設定的過程。開始 執行 ...
ORACLE亂碼問題的解決
使用sqlplus連線oracle資料庫的時候,老是出現?一類的字元,主要是因為 伺服器和客戶端語言設定不相同。日文環境下 伺服器端的設定為 ja16sjis,客戶端沒有作設定就出現了上述現象。請將環境變數設值為 csh setenv nls lang american japan.ja16sjis...
Oracle中的亂碼解決
之前在linux上安裝oracle,在安裝時沒有選擇字符集,在後來向其中插入中文資料時,就會出現亂碼。查詢oracle的字符集 修改字符集 這個不是很常用,特此記一下。查詢oracle的字符集 we8iso8859p1 預設 select userenv language from dual 方法一...