Oracle使用 expdp/impdp 产生字符集问题 导致ORA-02374 ORA-12899 ORA-02372

使用 expdp/impdp 产生字符集问题 导致ORA-02374 ORA-12899 ORA-02372

一、故障描述:
今天从源数据库expdp导出数据,然后往目标数据库impdp导入的时候,产生如下错误:
在这里插入图片描述

ORA-02374: conversion error loading table "ACS"."T_DI_NQHQ"
ORA-12899: value too large for column PROJECT_SPEC (actual: 12, maximum: 10)
ORA-02372: data for row: FHQZQJC : 0X'C8FDD3A2BEABC3DC'
//大致的意思是数据实际长度超过了给定的字段长度

二、问题分析:

  • 源数据库字符集: zhsgbk16
  • 目标端数据库字符集:al32utf8

zhsgbk16utf8 对数据编码之后,存储格式不同,对于中文来讲,GBK存放一个汉字占用2个字节,UTF8存放一个汉字占用3个字节,这样就会导致,比方说:原先GBK字符编码的数据库中的某张表中,存放中文的字段:colum001的类型是varchar 长度为200 ,并且该字段的大多数行的现有数据长度基本上在180个字节,那么该表导入UTF8编码的数据库中时,该字段原先存储的大多数180个字节的汉字,就需要180*3/2=270个字节左右的字符长度才能正常存放;而此时在执行impdp导入操作的时候,表结构是不会改变的,也就是原先的字段定义colum001的长度还是保持着200,因此在导入的时候,就会报错,出现上述错误信息。

三、解决方式:

1. 第一种方式:重新导出,导入
在源库执行导出操作之前,把ACS.T_DI_NQHQ字段改成超过12 。然后再往目标库导入的时候,就不会报错了。

2. 第二种方式:清空报错表的数据,修改相关字段的长度,然后重新导入只导入该表的数据。

truncate table T_DI_NQHQ;
alter table T_DI_NQHQ modify(FHQZQJC  VARCHAR2(60));

然后再重新导入(只导入数据)。

3. 第三种方式:如果不想改变目标端数据库的字符集,那么修改源数据库字符集(更改数据库字符集的操作不建议使用),然后执行重新导出操作,详细的步骤如下:

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP MOUNT EXCLUSIVE;

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

SQL>ALTER DATABASE OPEN;

SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;

SQL>SHUTDOWN immediate;

SQL>startup;

你可能感兴趣的:(数据库,ORA-02374,ORA-12899,ORA-02372,字符集问题,ORA-02374,ORA-12899,ORA-02372)