今天有人突然提出这么个问题让我解决。以前也有到过,直接alter system做的。

但是这次是就是要求ZHS16GBK改成UTF8,导致很多数据丢失。

分析一下:首先ZHS16GBK只支持中文和英文,ALTUTF8只是基本所有语言。

ZHS16GBK汉字只有两个字节,而UTF8汉字占3个字节,所以迁移时候长度不够。

exp/imp错误。

总结了一下基本一下几种方法:

1.所有长度增大1.5倍,理论是可以的,但是有些哥们说他们试过基本行不通,很多都是增加3倍才搞定,不知道什么原因,超过4000的就要考虑大长度类型了。这么做保险。

2.建立dblink,用insert select这种方式做。convert 转换zhgbk-------&gtutf8

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐