impdp导入时遇到ora-12899,ora-02374,ora-02372

ORA-02374: conversion error loading table "MPJ"."SM_MMS_MTDB"
ORA-12899: value too large for column SUBJECT (actual: 59, maximum: 50)

ORA-02372: data for row: SUBJECT : 0X'B6CCD0C5CDA8B5C0D2ECB3A3A3ACBBFDD1B931303030A3ACD7'

出现这个错误, 是因为原来的数据库是GBK的,每个汉字两个字节,但新数据库是UTF-8的,每个汉字是三个字节,导致超过长度报错。所以要看下数据库的字符集看看是否一致,不一致需要调整。
 

步骤 1:确认当前字符集

首先查询数据库当前的字符集:

sql

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET';

如果返回 AL32UTF8,则表示当前使用的是 UTF-8 字符集。

步骤 2:检查数据兼容性

确保所有现有数据都可以无损转换为 GBK。使用以下命令检查:

sql

ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';

-- 检查非 GBK 字符
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_NCHAR_CHARACTERSET';

-- 运行字符集扫描工具(需 DBA 权限)
$ sqlplus / AS SYSDBA
SQL> @?/rdbms/admin/utl32k.sql

如果发现无法转换的字符,需先处理这些数据(如删除或替换)。

步骤 3:关闭数据库

确保没有用户连接,并关闭数据库:

sql

SHUTDOWN IMMEDIATE;

步骤 4:以限制模式启动数据库

sql

STARTUP RESTRICT;

步骤 5:更改字符集

使用 ALTER DATABASE CHARACTER SET INTERNAL_USE 命令(注意:INTERNAL_USE 绕过字符集验证,但可能导致数据丢失):

sql

ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;

如果遇到错误(如 ORA-12712),说明存在无法转换的字符,需返回步骤 2 进一步处理。

步骤 6:重启数据库

sql

SHUTDOWN IMMEDIATE;
STARTUP;

步骤 7:验证更改

再次查询字符集确认更改成功:

sql

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值