oracle 字符集问题

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:27   1915   0

问题描述:

这是在将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;

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP