解决oracle字符集不同导入数据失败问题

oracle不同字符集导入导出(GBK导入UTF8)

因数据库迁移,需要将原oracle备份文件导入新的oracle数据库中,EXP导出后,IMP报错,发现字符串长度太长报错。查找后发现,原数据库为GBK字符集(oracle在varchar2类型中一个汉字占用两位),新数据库为UTF8字符集(一个汉字占用三位)。

  • 先查询字符集是否一致

select userenv(‘language’) from dual;

确认字符集不一样后,按如下方法解决:

说明:首先确认一下你的数据库字符集,是不是和原来的字符集格式一致,否则数据导入后会出现字符过长的情况,某些数据没办法进行导入。而且如果导入后在修改,可能会导致数据库的内容出现乱码。出现了乱码后。你可以使用Navicat Premium的数据传输进行单纯的数据同步。但你会发现原来第一次没有注意Oracle字符集的数据会出现Views、Synonyms、Functions还是乱码。所以你只能先修改Oracle字符集,然后导入;或者直接修改varchar2的字段长度。

解决方法如下,将原数据库所有含varchar2的字段的长度批量修改。

修改分为两步,varchar2最长支持4000的长度,若carchar2长度存在超过2667(4000*2/3)的,可修改为CLOB类型,或者验证字段中最长的使用长度,若低于2667,调整为4000即可。

批量修改方法如下:

create or replace procedure p_test as

CURSOR TEMP IS
SELECT TABLE_NAME, COLUMN_NAME, ceil(DATA_LENGTH*3/2) DATA_LENGTH
FROM USER_TAB_COLUMNS
WHERE DATA_TYPE = 'VARCHAR2'
and DATA_LENGTH < 2000;
STR VARCHAR2(100) := '';
BEGIN
FOR S IN TEMP LOOP
STR := 'ALTER TABLE ' || S.TABLE_NAME || ' MODIFY(' || S.COLUMN_NAME ||
' VARCHAR2(' || DATA_LENGTH || '))';
DBMS_OUTPUT.PUT_LINE(STR);
EXECUTE IMMEDIATE STR;

END LOOP;
END;

注意:若存在字段的函数索引,批量修改会报错需将函数索引删除,才可执行。

最后,导出dmp,然后IMP导入即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值