RACLE 错误 12899 处理, oracle 11g 更改字符集
工作需要,安装装了oracle 11g,在导入其他机器上的备份数据的时间,发生一个错误:
IMP-00019: 由于 ORACLE 错误 12899 而拒绝行
IMP-00003: 遇到 ORACLE 错误 12899
ORA-12899: 列 "ZHENG"."D_DIC"."DICEXPLAIN" 的值太大 (实际值: 140, 最大值: 100)
这个数据表结构是直接注入的,根本不会这样子的啊。后来在网上查了才知道原来是字符集的问题:
在日志文件里,开始导入时候有这样一个提示:"
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
"原来在我的Windows server 2003系统上安装oracle,默认的字符集跟操作系统一致,是AL32UTF8。
AL32UTF8里,一个汉字是占用3个字符位,而一般我们用Windows XP中默认的是ZHS16GBK ,一个汉字用2个字符位。这样,直接导入数据就直接溢出了。
查看字符集的方法可以用PL/SQL DEVELOP ---->Reports---->DBA---->NLS Database Parameters,结果如下图:

在网上找到一个修改字符集的方法:
SQL> conn sys/sys as sysdba;
SQL> shutdown immediate;
SQL> STARTUP MOUNT;
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
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 ZHS16GBK;
备注,如果上面一行出现“ORA-12712: 新字符集必须为旧字符集的超集”错误时,可以再执行一句这一行代码:
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK; SQL> Shutdown immediate;
SQL> startup;oracle数据库的字符集更改
A、oracle server端字符集查询 
select userenv(‘language’) from dual 
其中NLS_CHARACTERSET 为server端字符集 
NLS_LANGUAGE 为 server端字符显示形式
B、查询oracle client端的字符集 
$echo $NLS_LANG 
如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。
C、server端字符集修改 
***************************************************************** 
* 更改字符集步骤方法(WE8ISO8859P1 --> ZHS16GBK)            * 
***************************************************************** 
SQL> 
将数据库启动到RESTRICTED模式下做字符集更改: 
SQL> conn /as sysdba 
Connected. 
SQL> shutdown immediate; 
Database closed. 
Database dismounted. 
ORACLE instance shut down. 
SQL> startup mount 
ORACLE instance started. 
Total System Global Area 236000356 bytes 
Fixed Size                   451684 bytes 
Variable Size             201326592 bytes 
Database Buffers           33554432 bytes 
Redo Buffers                 667648 bytes 
Database mounted. 
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; 
System altered. 
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
System altered. 
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; 
System altered. 
SQL> alter database open; 
Database altered. 
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; 
ALTER DATABASE CHARACTER SET ZHS16GBK 
* 
ERROR at line 1: 
ORA-12712: new character set must be a superset of old character set 
提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改: 
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; 
Database altered. 
SQL> select * from v$nls_parameters; 
略 
19 rows selected. 
重启检查是否更改完成: 
SQL> shutdown immediate; 
Database closed. 
Database dismounted. 
ORACLE instance shut down. 
SQL> startup 
ORACLE instance started. 
Total System Global Area 236000356 bytes 
Fixed Size                   451684 bytes 
Variable Size             201326592 bytes 
Database Buffers           33554432 bytes 
Redo Buffers                 667648 bytes 
Database mounted. 
Database opened. 
SQL> select * from v$nls_parameters; 
略 
19 rows selected. 
我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使 
Oracle数据库绕过了子集与超集的校验. 
这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责: 
结语(我们不妨再说一次): 
对于DBA来说,有一个很重要的原则就是:不要把你的数据库置于危险的境地! 
这就要求我们,在进行任何可能对数据库结构发生改变的操作之前,先做有效的备份,很多DBA没有备份的操作中得到了惨痛的教训 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
D、client端字符集修改 
在 /home/oracle与 /root用户目录下的.bash_profile中 
添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句 
关闭当前ssh窗口。 
注意 NLS_LANG变量一定要配置正确否则会引起sqlplus 失效
参考
RACLE 错误 12899 处理, oracle 11g 更改字符集的更多相关文章
- Oracle 11g 更改字符集
		
查看字符集: select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET'; 修改字符集: sqlplus "/as ...
 - Oracle 11g修改字符集AL32UTF8为ZHS16GBK
		
oracle11g更改字符集AL32UTF8为ZHS16GBK当初安装oracle的时候选择的默认安装,结果字符集不是以前经常用的16GBK,要改字符集,从网上找到了方法并试了一下,果然好用! 具体如 ...
 - Oracle 11g 修改字符集 为 ZHS16GBK
		
方法一:sqlplus “用户/密码 as sysdba” sqlplus “sys/sys as sysdba” 方法二:sqlplus/nolog SQL> conn /as sysdba ...
 - oracle数据库更改字符集
		
在数据迁徙的时候需要使源和目标数据库的字符集.版本等信息统一…… 这里是对一个数据库的设置,需要在两边进行同样的操作. SYS@PROD1> select userenv('language') ...
 - Oracle 11g修改字符集
		
选择静默安装的安装字符集为默认的ZHS16GBK,工作中字符集为为AL32UTF8 一.登录oracle sqlplus / as sysdba shutdown immediate; STARTUP ...
 - oracle数据库更改字符集为utf-8,亲测有效
		
>shutdown immediate; (把database停了) >startup mount; (把database重开) >alter system enable restr ...
 - 【Oracle】Oracle 11g 64位安装完后,ora-12541错误和ora-12514错误的解决
		
问题描述: 干净的windows2008 64位服务器上安装 oracle 11g R2 64bit服务端,安装完后,NetManager中默认的主机名为localhost,可以测试通过.但是无法在别 ...
 - oracle导入数据库报错:IMP-00019: 由于 ORACLE 错误 12899 而拒绝行 IMP-00003: 遇到 ORACLE 错误 12899
		
主要是字符集 成 导入的Oracle服务器的字符集 对应不上. 以下方案为是修改服务器的字符集. 这样会影响之前的Oracle其他数据库的数据显示(正式服务器慎用) 个人认为应该修改导出文件的字 ...
 - [转] 64位Oracle 11g R2的客户端连接时报ORA-01019错误
		
本文转自:http://blog.csdn.net/downmoon/article/details/8038583 在Win8企业版64位环境下,连接Oracle11g 服务端,搞了整整两天,特将过 ...
 
随机推荐
- 3D Studio Max [www]
			
https://github.com/RealityFactory/Exporters https://github.com/code-google-com/3ds-max-dev https://g ...
 - 调用start()与run()的区别
			
1.调用start()方法: 通知“线程规划器”当前线程已经准备就绪,等待调用线程对象的run()方法.这个过程就是让系统安排一个时间来调用Thread中的run()方法,使线程得到运行,启动线程,具 ...
 - 【UOJ#9】vfk的数据
			
我感觉这题可以出给新高一玩2333 #include<bits/stdc++.h> #define N 10005 using namespace std; string s[N]; in ...
 - Network——物理层-练习题与解答
			
1. 无线电天线通常在其直径等于无线电波的波长的情况下工作效果最好.合理的天线直径的范围是从1厘米到5米.问所覆盖的频率范围是怎样的? 解答: λf = c , c=3x108 (m/s) 对于λ=1 ...
 - IntelJ IDEA 进行Java Web开发+热部署+一些开发上的问题
			
基本上像放弃MyEclipse或者Eclipse了,因为IDEA现在也有对应的版本旗舰版和社区版了,而且使用更贴心,更给力,为什么还要选一个难用的要死的东西呢? 最近要开发一个Java Web项目,所 ...
 - maven设置打jar包并引入依赖包
			
--------------------------------------------------------方法一:将jar包和项目打在一起---------------------------- ...
 - php文件上传需要的配置
			
服务端配置(php.ini) 1.file_uploads=On //支持HTTP上传 2.upload_tmp_dir =”” //临时文件保存的目录 3.upload_max_filesize ...
 - php文件上传错误信息
			
错误信息说明 UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功 UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini和upload_max_filesize ...
 - Go语言的web程序写法
			
一切来自于扩展... 核心也即处理输入输出... // helloworld project main.go package main import ( "fmt" "h ...
 - hdu5740
			
考验代码能力的题目,感觉网络流一要求输出方案我就写的丑 http://www.cnblogs.com/duoxiao/p/5777632.html 官方题解写的很详细 因为如果一个点染色确定后,整个图 ...