PL/SQL Developer 在windows7 64位系統下連Oaracle11g64位系統的解決經驗,windows7系統下載
PL/SQL Developer 在windows7 64位系統下連Oaracle11g64位系統的解決經驗
一、問題現象及解決方案
現象:
1.PL/SQL 無法登入64位元據庫
2.在PL/SQL developer中輸入中文,儲存後,中文變成'??'這樣的亂碼符號
3.匯入帶有中文的資料後,中文資料變成'??'這樣的亂碼符號
環境:
1.windows7 64位系統
2.oracle11g 64位系統
3.PL/SQL developer 9.0
解決方案:
1.下載windows32位的instantclient包,並放到某個目錄下,假設D:\instantclient
2.拷貝D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN到D:\instantclient下
(假設oracle11g安裝目錄是D:\App\Administrator\Product\11.2.0\dbhome_1\)
3.把tnsnames.ora檔案放到D:\instantclient\Network\Admin目錄下
4.把D:\instantclient加到作業系統的Path路徑的最前面。
5.增加系統內容變數TNS_ADMIN變數的值為D:\instantclient
6.PL/SQL Developer的工具喜好設定的Oracle主目錄名為D:\instantclient,OCI庫為D:\instantclient\OCI.DLL
7.核對Oracle11g的字元集和作業系統的字元集是否一致,一致才不會亂碼,假設需一致為ZHS16GBK。
8.如果Oracle11g字元集不是ZHS16GBK,修改oracle11g的字元集為ZHS16GBK
9.增加作業系統環境變數NLS_LANG變數的值為SIMPLIFIED CHINESE_CHINA.ZHS16GBK或AMERICAN.ZHS16GBK
二、經驗教訓
網路上對於此類問題,大多也是這麼解決的。我按照網路上的方法試了很多次,還重裝過幾次Oracle,折騰很久最終才解決了亂碼問題。
之所以折騰很久,是因為驗證方法上出現了失誤,在問題解決之前,我一直覺得要把之前輸入的中文變成的‘????',使之再次變成中文才算解決問題,
實際上再次錄入中文,儲存後不變成‘???’即解決亂碼問題,所以細節很重要。有的時候,在普遍的方法都是一樣的方法的時候,那麼這種方法應該是奏效的,至於一次次 的操作後,還沒解決問題,應該冷靜的想想操作過程,想想細節,問題可能就出在操作細節上,驗證方法上。
三、相關知識
1、如何查看windows作業系統當前使用的字元集
Chcp
顯示活動控制台字碼頁數量,或更改該控制台的活動控制台字碼頁。如果在沒有參數的情況下使用,則 chcp 顯示活動控制台字碼頁的數量。
文法
chcp [nnn]
參數
指定字碼頁。下表列出了所有支援的字碼頁及其國家(地區)或者語言:
字碼頁 國家(地區)或語言
437 美國
708 阿拉伯文(ASMO 708)
720 阿拉伯文(DOS)
850 多語言(拉丁文 I)
852 中歐(DOS) - 斯拉夫語(拉丁文 II)
855 西裡爾文(俄語)
857 土耳其語
860 葡萄牙語
861 冰島語
862 希伯來文(DOS)
863 加拿大 - 法語
865 日耳曼語
866 俄語 - 西裡爾文(DOS)
869 現代希臘語
874 泰文(Windows)
932 日文(Shift-JIS)
936 中國 - 簡體中文(GB2312)
949 韓文
950 繁體中文(Big5)
1200 Unicode
1201 Unicode (Big-Endian)
1250 中歐(Windows)
1251 西裡爾文(Windows)
1252 西歐(Windows)
1253 希臘文(Windows)
1254 土耳其文(Windows)
1255 希伯來文(Windows)
1256 阿拉伯文(Windows)
1257 波羅的海文(Windows)
1258 越南文(Windows)
20866 西裡爾文(KOI8-R)
21866 西裡爾文(KOI8-U)
28592 中歐(ISO)
28593 拉丁文 3 (ISO)
28594 波羅的海文(ISO)
28595 西裡爾文(ISO)
28596 阿拉伯文(ISO)
28597 希臘文(ISO)
28598 希伯來文(ISO-Visual)
38598 希伯來文(ISO-Logical)
50000 使用者定義的
50001 自動選擇
50220 日文(JIS)
50221 日文(JIS-允許一個位元組的片假名)
50222 日文(JIS-允許一個位元組的片假名 - SO/SI)
50225 韓文(ISO)
50932 日文(自動選擇)
50949 韓文(自動選擇)
51932 日文(EUC)
51949 韓文(EUC)
52936 簡體中文(HZ)
65000 Unicode (UTF-7)
65001 Unicode (UTF-8)
在Windows平台下,直接在命令列中,輸入以下命令,就會顯示windows作業系統當前使用的字元集:
chcp
影響Oracle資料庫字元集最重要的參數是NLS_LANG參數。
它的格式如下: NLS_LANG = language_territory.charset
它有三個組成部分(語言、地區和字元集),每個成分控制了NLS子集的特性。
其中:
Language: 指定伺服器訊息的語言, 影響提示資訊是中文還是英文
Territory: 指定伺服器的日期和數字格式,
Charset: 指定字元集。
如:AMERICAN _ AMERICA. ZHS16GBK
從NLS_LANG的組成我們可以看出,真正影響資料庫字元集的其實是第三部分。
所以兩個資料庫之間的字元集只要第三部分一樣就可以相互匯入匯出資料,前面影響的只是提示資訊是中文還是英文。
怎麼查看資料庫版本
select * from v$version 包含版本資訊,核心版本資訊,位元資訊(32位或64位)等
2、查看資料庫字元集
資料庫伺服器字元集select * from nls_database_parameters,其來源於props$,是表示資料庫的字元集。
用戶端字元集環境select * from nls_instance_parameters,其來源於v$parameter,表示用戶端的字元集的設定,可能是參數檔案,環境變數或者是註冊表
會話字元集環境select * from nls_session_parameters,其來源於v$nls_parameters,表示會話自己的設定,可能是會話的環境變數或者是alter session完成,如果會話沒有特殊的設定,將與nls_instance_parameters一致。
查詢oracle server端的字元集
有很多種方法可以查出oracle server端的字元集,比較直觀的查詢方法是以下這種:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK