修改数据库字符集导致的数据异常

来源:这里教程网 时间:2026-03-03 16:50:26 作者:

一、故障现象

1.查询某个表时出现ORA-03106:fatal two-task communication protocol error报错
2.通过CTAS重建该表时会出现ORA-12899:value too large for column xxx.xxx(actual:12,maximum:6)
3.通过扩大列的长度,将数据插入新表,字符串会多出来一个字符
4.使用datapump导出数据会出现ORA-00600:internal error code,arguments:[kokle_lob2lob13:input mismatch],[1],[],[],[]错误
5.使用exp导出数据会出现ORA-06553:PLS-553:character set name is not recognized错误

二、问题分析
根据mos文档(Doc ID 1276205.1)的描述,是由于数据库修改字符集导致的。
select distinct (nls_charset_name(charsetid)) CHARACTERSET,
                decode(type#,
                       1,
                       decode(charsetform,
                              1,
                              'VARCHAR2',
                              2,
                              'NVARCHAR2',
                              'UNKNOWN'),
                       9,
                       decode(charsetform,
                              1,
                              'VARCHAR',
                              2,
                              'NCHAR VARYING',
                              'UNKNOWN'),
                       96,
                       decode(charsetform, 1, 'CHAR', 2, 'NCHAR', 'UNKNOWN'),
                       8,
                       decode(charsetform, 1, 'LONG', 'UNKNOWN'),
                       112,
                       decode(charsetform, 1, 'CLOB', 2, 'NCLOB', 'UNKNOWN')) TYPES_USED_IN
  from sys.col$
 where charsetform in (1, 2)
   and type# in (1, 8, 9, 96, 112)
 order by CHARACTERSET, TYPES_USED_IN;

根据查询结果,数据库使用了两种字符集,而且AL32UTF8并不是ZHS16GBK的超集。

相关推荐