Oracle11g字符集AL32UTF8修改為ZHS16GBK詳解【轉】


——————感謝作者,確實解決了問題。分享下,希望幫到更多人

此問題發生在數據庫遷移過程中。源數據庫:自己筆記本上win7 64位系統的oracle11g個人版,字符集ZHS16GBK ;目標數據庫,HP的sqlserver2008 系統 64位數據庫服務器,字符集AL32UTF8 。

今天下午在部署HP的一台數據庫服務器時,裝的oracle11g 企業版默認字符集為AL32UTF8,

而我本地電腦裝的oracle11g 個人版數據庫字符集server端默認是ZHS16GBK,所以在我把我本機導出的數據庫.dmp文件導入到Hp的數據庫時,報

imp錯誤並且錯誤描述信息為中文亂碼。然后經過我上網查閱資料得知 如果要解決亂碼問題必須滿足下面條件:

目標數據庫的服務端和客戶端字符集以及要從我本地導入源數據庫的dmp文件中的字符集格式必須一樣。而我本地源數據庫字符集是ZHS16GBK,目標服務器端字符集是AL32UTF8 ,顯然不滿足以上條件。

然后我首先嘗試下面方式更改HP服務器數據庫字符:

嘗試方法一:在sys/sys 下面執行下面語句:(失敗)

注:SQL> alter database CHARACTER SET ZHS16GBK;
alter database CHARACTER SET ZHS16GBK

結果報下面錯誤:
ERROR 位於第 1 行:
ORA-12712: 新字符集必須為舊字符集的超集。

注:超集解釋:如果s1集合包含s2集合中的每一個元素,並且s1集合中有可能包含s2集合中不含有的元素時,那么稱s1是s2的超級。說明AL32UTF8包含ZHS16GBK。

嘗試方法二:用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 ,導入執行成功。


免責聲明!

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



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