[20130106]整和資料庫--修改字符集.txt

lfree發表於2013-01-06
[20130106]整和資料庫--修改字符集.txt

工作需要,需要把幾個資料庫合併在一起,由於以前資料庫使用的字符集是AMERICAN_AMERICA.US7ASCII,而現在的資料庫使用
SIMPLIFIED CHINESE_CHINA.ZHS16GBK,整合的時候需要修改字符集,統一到字符集SIMPLIFIED CHINESE_CHINA.ZHS16GBK。

自己google看了一些blog和文件,最終選擇這個方式,自己做一個記錄:英文字符集轉化到中文字符集。當然這個轉化的前提
條件是應用表中欄位沒有clob欄位型別。

1.轉換方法:
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET aq_tm_processes=0;
ALTER DATABASE OPEN;
update sys.props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';
commit;
--update sys.props$ set value$='AL16UTF16' where name='NLS_NCHAR_CHARACTERSET';
--commit;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=10;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;

COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
--ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;


2.CLOB欄位問題:
實際上這種轉換是存在一些小問題的,應用表如果有clob欄位(其他欄位型別目前不是很清楚是否存在這個問題),顯示clob的內容
會存在亂碼!如果這些表不多可以採用exp/imp方式(注意匯出的檔案要做一些小修改)
[注:修改dmp檔案00 01 => 03 54,注意2,3位元組,以及07 do前面的兩處。這種包含clob欄位沒有測試過]

即使這樣,system,sys使用者依舊存在一些欄位是clob型別的,無法避開這些欄位顯示出現亂碼,這不過對應用影響不大。
SELECT owner, table_name, column_name
  FROM dba_tab_cols
 WHERE data_type = 'CLOB' and table_name not like 'V_%';

執行
select * from sys.METASTYLESHEET;
欄位STYLESHEET顯示的就是亂碼。

SELECT   owner, table_name, COUNT (*)
    FROM (SELECT owner, table_name, column_name
            FROM dba_tab_cols
           WHERE data_type = 'CLOB' AND table_name NOT LIKE 'V_%')
GROUP BY owner, table_name
ORDER BY 1, 2
大約19X個,不過許多是空表。還有一些檢視,不過我懶的去解決這些問題,好像對應用影響不大。

關於clob亂碼問題,留待以後研究。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-752174/,如需轉載,請註明出處,否則將追究法律責任。

相關文章