问题描述:
这是在将dmp文件导入oracle的时候,遇到的另一个问题。在导入的时候遇到如下提示:
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
报错如下:
IMP-00019: 由于 ORACLE 错误 12899 而拒绝行 IMP-00003: 遇到 ORACLE 错误 12899 ORA-12899: 列 "SYSTEM"."表名"."字段名" 的值太大 (实际值: 33, 最大值: 32)
相关概念:
字符集(Character set):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。常见的字符集有ASCII,ZHS16GB231280,ZHS16GBK等。
Oracle数据库服务器字符集:即Oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置。
select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
可以看到oracle的字符集是 AL32UTF8的,结合“已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入”,可知,导致错误的原因是字符集不匹配,从而使得字段长度超过了限制。我们只需要将数据库的编码修改一下就不会出现错误了。
解决办法:
在oracle sql developer中运行
ALTER DATABASE CHARACTER SET ZHS16GBK;
我在实际操作中遇到了三个错误。
1) ERROR at line 1: ORA-12721: operation cannot execute when other sessions are active
发生此错误,说明有sessions正在占用,使用
select sid,serial#,username,machine from v$session;
来查看有哪些当前用户正在执行的sessions,然后使用命令
alter system kill session 'sid,serial' immediate;
来杀死这些占用的sessions
2)ERROR at line 1: ORA-12712: new character set must be a superset of old character set
此错误表示,新的字符集必须是旧字符集的超集。注意:这是因为数据库已有数据,如果现在修改字符集,且不是旧字符集的超集时,现有数据可能会发生编码错误。
在将现有数据安顿完毕后,使用命令
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
就能跳过超集的检测。
3)ERROR at line 1: ORA-12719: operation requires database is in RESTRICTED mode
遇到这个错误的时候,需要切换一下模式,使用命令
ALTER SYSTEM ENABLE RESTRICTED SESSION;
注:执行修改字符集操作时,需要以SYS身份连接。
由此就完成了数据库字符集的变更。
后续:
在修改完字符集后,再用其他用户连接oracle数据库出现错误。
oracle ORA-12526: TNS: 监听程序: 所有适用例程都处于受限模式。
这是因为前面修改了数据库模式,再改回去就行了。执行命令:
ALTER SYSTEM DISABLE RESTRICTED SESSION;
|