程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle11g字符集AL32UTF8修改為ZHS16GBK詳解

Oracle11g字符集AL32UTF8修改為ZHS16GBK詳解

編輯:Oracle教程

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語句都會有相應的提示,請輸入時務必仔細。


  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 命令未正確結束,不過執行上一行命令已經生效,其他文章裡未提到本行。
 

  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 ,導入執行成功。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved