天天看點

遷移資料時oracle字元集的轉換遷移資料時oracle字元集的轉換

在遷移資料過程中我使用過兩種方法一是修改dmp檔案的字元集一是修改資料庫的字元集.

修改dmp檔案字元集,dmp檔案的第2第3位元組記錄了字元集資訊,是以直接修改dmp檔案的第2第3位元組的内容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關系的情況下也可以修改,我們常用的一些字元集,如us7ascii,we8iso8859p1,zhs16cgb231280,zhs16gbk基本都可以改。因為改的隻是dmp檔案,是以影響不大。

具體的修改方法比較多,最簡單的就是直接用ultraedit修改dmp檔案的第2和第3個位元組。

比如想将dmp檔案的字元集改為zhs16gbk,可以用以下sql查出該種字元集對應的16進制代碼: sql> select to_char(nls_charset_id('zhs16gbk'), 'xxxx') from dual;

0354 然後将dmp檔案的2、3位元組修改為0354即可,但是這樣種方法隻能使用oracle8及以下版本的用戶端導出的dmp才能修改

一種是修改資料庫字元集,因為官方文檔是說建立資料庫後是不能修改,但是沒辦法工作需要在遷移資料時先建立一個中間資料庫使用源資料庫的字元集進行建立的

将源資料庫的資料導入中間資料庫後修改中間資料庫的字元集使其與目标資料庫的字元集一至,再從中間資料庫将資料導入目标資料庫.我這樣做很麻煩,後面有一次由于

目标資料庫是沒有業務資料是以就直接修改了目标資料庫字元集将源資料庫的資料導入進來了.

---1---修改資料庫裡的字元集

---中文字元集轉英文字元集

--英文

update sys.props$ set value$='us7ascii' where name='nls_characterset';

commit;

update sys.props$ set value$='us7ascii' where name='nls_nchar_characterset';

---2---修改強制同步資料庫裡的字元集

shutdown immediate;

startup mount;

alter system enable restricted session;

alter system set job_queue_processes=0;

alter system set aq_tm_processes=0;

alter database open;

---給charset變量指派

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';

--internal_use是沒有寫在文檔中的參數,用以強制完成字元集一緻化

alter database character set internal_use &charset;

--alter database national character set internal_use &ncharset;

-- 再次啟動資料庫一遍

startup;

set nls_lang=american_america.us7ascii;

---英文字元集轉中文字元集

update sys.props$ set value$='zhs16gbk' where name='nls_characterset';

update sys.props$ set value$='zhs16gbk' where name='nls_nchar_characterset';

set nls_lang=simplified chinese_china.zhs16gbk;

1,修改dmp的時候,注意資料庫版本

9i以以下的資料庫,需要修改dmp檔案第1行的第2和第3個位元組

10g以上的資料庫,需要修改dmp檔案第3行的第3和第4個位元組

這個方法比較局限,比如,你的資料庫10t,這個方法顯然就不行。。。。

2,強制修改是資料庫字元集

從10以後,oracle推薦使用csscan

3,補充一個,對于資料量大的資料庫整體遷移,這個方法顯然不行,僅僅是用于少量資料庫或者某些含多位元組(如中文)少的表

dblink+utl_raw

這是lunar_zhang給我的提供的另外的方法在這附上,謝謝他的方法