——————感謝做者,確實解決了問題。分享下,但願幫到更多人html
此問題發生在數據庫遷移過程當中。源數據庫:本身筆記本上win7 64位系統的oracle11g我的版,字符集ZHS16GBK ;目標數據庫,HP的sqlserver2008 系統 64位數據庫服務器,字符集AL32UTF8 。java
今天下午在部署HP的一臺數據庫服務器時,裝的oracle11g 企業版默認字符集爲AL32UTF8,sql
而我本地電腦裝的oracle11g 我的版數據庫字符集server端默認是ZHS16GBK,因此在我把我本機導出的數據庫.dmp文件導入到Hp的數據庫時,報數據庫
imp錯誤而且錯誤描述信息爲中文亂碼。而後通過我上網查閱資料得知 若是要解決亂碼問題必須知足下面條件:服務器
目標數據庫的服務端和客戶端字符集以及要從我本地導入源數據庫的dmp文件中的字符集格式必須同樣。而我本地源數據庫字符集是ZHS16GBK,目標服務器端字符集是AL32UTF8 ,顯然不知足以上條件。oracle
而後我首先嚐試下面方式更改HP服務器數據庫字符:sqlserver
嘗試方法一:在sys/sys 下面執行下面語句:(失敗)測試
注:SQL> alter database CHARACTER SET ZHS16GBK;
alter database CHARACTER SET ZHS16GBK
結果報下面錯誤:
ERROR 位於第 1 行:
ORA-12712: 新字符集必須爲舊字符集的超集。spa
注:超集解釋:若是s1集合包含s2集合中的每個元素,而且s1集合中有可能包含s2集合中不含有的元素時,那麼稱s1是s2的超級。說明AL32UTF8包含ZHS16GBK。code
嘗試方法二:用scott/tiger 登錄 sqlplus 而後connect sys/sys as sysdba,而後輸入命令便可,文中標紅的請用本身設置的密碼。(此方法測試後成功!)
而後在sqlplus界面依次執行如下sql語句:
若此時數據庫服務器已啓動,則先執行SHUTDOWN IMMEDIATE命令關閉數據庫服務器,而後執行如下命令:注:每條sql語句都會有相應的提示,請輸入時務必仔細。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=
0
;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=
0
;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
//跳過超子集檢測
SQL>ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;
|
這一行不起做用,執行後出錯ORA-00933: SQL 命令未正確結束,不過執行上一行命令已經生效,其餘文章裏未提到本行。
1
2
3
4
|
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
|
最後重啓oracle11g監聽和服務,從新登陸PL/SQL developer ,
執行select userenv('language') nls_lang from dual; 發現目標數據庫字符集以下,已經正確修改成SIMPLIFIED 。CHINESE_CHINA.ZHS16GBK。
NLS_LANG
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
而後再執行相應的imp ldpssts/ldpssts@orcl fromuser=lspss touser=ldpssts file=D:\imp\ldpssts.dmp log=D:\imp\ldpssts.log ,導入執行成功。