现象:
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,结果如下图:
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,再查字符集,结果如下
4,修改环境变量
此时,如果从 plsql developer 里查看发现中文字段值乱码,但通过 sqlplus 查看没有乱码。则需要做下边的。
1)电脑的环境变量中的用户变量中新建一个变量名为NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK的变量
2)重启 plsql developer