今天有人突然提出这么个问题让我解决。以前也有到过,直接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;
应该是很慢。
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;
/
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
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26865454/viewspace-748189/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26865454/viewspace-748189/
本文详细分析了从ZHS16GBK字符集迁移至UTF8时出现的数据丢失问题,并提出了四种解决方法:增大长度、建立dblink进行数据迁移、使用CSSCAN工具检查数据库,以及一种基于脚本的解决方案。文章提供了实践指导和避免迁移过程中数据丢失的策略。
1360

被折叠的 条评论
为什么被折叠?



