oracle 迁库中文转问好,ORACLE数据库迁移(ZHS16GBK到UTF8)
今天有人突然提出这么个问题让我解决。以前也有到过,直接alter system做的。但是这次是就是要求ZHS16GBK改成UTF8,导致很多数据丢失。分析一下:首先ZHS16GBK只支持中文和英文,ALTUTF8只是基本所有语言。ZHS16GBK汉字只有两个字节,而UTF8汉字占3个字节,所以迁移时候长度不够。exp/imp错误。总结了一下基本一下几种方法:1.所有长度增大1.5倍,理论是可以的,
今天有人突然提出这么个问题让我解决。以前也有到过,直接alter system做的。
但是这次是就是要求ZHS16GBK改成UTF8,导致很多数据丢失。
分析一下:首先ZHS16GBK只支持中文和英文,ALTUTF8只是基本所有语言。
ZHS16GBK汉字只有两个字节,而UTF8汉字占3个字节,所以迁移时候长度不够。
exp/imp错误。
总结了一下基本一下几种方法:
1.所有长度增大1.5倍,理论是可以的,但是有些哥们说他们试过基本行不通,很多都是增加3倍才搞定,不知道什么原因,超过4000的就要考虑大长度类型了。这么做保险。
2.建立dblink,用insert select这种方式做。convert 转换zhgbk------->utf8
insert xxxxx select col,covert(co_char,'UTF8','ZHS16CGB231280') from xxxxx@dblink;
应该是很慢。
3.使用CSSCAN工具,检查下。
首先使用csscan扫描数据库或者某些表,然后执行如下过程
conn / as sysdba
set serveroutput on
DECLARE
newmaxsz NUMBER;
BEGIN
FOR rec in
( SELECT distinct u.owner_name, u.table_name, u.column_name ,
u.column_type, u.owner_id, u.table_id, u.column_id,
u.column_intid FROM csmv$errors u
WHERE u.error_type='EXCEED_SIZE'
order by u.owner_name, u.table_name, u.column_name)
LOOP
select MAX(cnvsize)INTO newmaxsz from csm$errors WHERE
usr#=rec.owner_id and obj#=rec.table_id
and col#=rec.column_id and intcol#=rec.column_intid;
DBMS_OUTPUT.PUT_LINE(rec.owner_name ||'.'|| rec.table_name||' ('||
rec.column_name ||') - '|| rec.column_type ||' - '||
newmaxsz || ' Bytes');
END LOOP;
END;
/
这个需要执行一个脚本才拥有csmv$errors视图。
SQL> @ ?/rdbms/admin/csminst.sql
更多推荐
所有评论(0)