oracle impdp 报错ORA-12899: value too large for column XXXX (actual: 45, maximum: 40)

时间:2024-04-10 22:05:02

现象:

oracle impdp 报错ORA-12899: value too large for column XXXX (actual: 45, maximum: 40)

原因:

插入的数据长度超出字段的设置长度,实际长度并不长,这是由于Oracle字符集不同,汉字占的长度不同造成的。中文在ZHS16GBK中占2个字节,在UTF-8中却占3个字节,所以汉字导入UTF-8字符集的数据库就很容易出现字段长度不够

解决:

1,查看字符集

用PL/SQL DEVELOP ---->Reports---->DBA---->NLS Database Parameters,结果如下图:

oracle impdp 报错ORA-12899: value too large for column XXXX (actual: 45, maximum: 40)

2,修改字符集

sqlplus / as sysdba
SQL>shutdown immediate
SQL>STARTUP MOUNT
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 CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP

3,再查字符集,结果如下

oracle impdp 报错ORA-12899: value too large for column XXXX (actual: 45, maximum: 40)

4,修改环境变量 

此时,如果从 plsql developer 里查看发现中文字段值乱码,但通过 sqlplus 查看没有乱码。则需要做下边的。

1)电脑的环境变量中的用户变量中新建一个变量名为NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK的变量

oracle impdp 报错ORA-12899: value too large for column XXXX (actual: 45, maximum: 40)

2)重启 plsql developer