Oracle10g更改数据库字符集
2012-09-16 11:20
381 查看
一、软件环境
1)oracle 10g
二、问题描述
Oracle数据库中文字符出现乱码,所以的中文字符显示’?’符号
三、原因分析
Oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库。
四、解决方案
需要修改数据库字符集为'us7ascii'。
查看数据库当前数据集有两种方式:
a).select name,value$ from props$ where name like '%NLS%',其中NLS_CHARACTERSET所对应的为当前数据库的字符集;
b).select userenv('language') from dual;
1.常规方案修改数据库字符集
1).以管理员身份登录:conn sys/xxx as sysdba,或者conn / as sysdba;
2).关闭数据库:shutdown immediate;
3).以mount方式开启数据库:startup mount
4).限制其它用户连接数据库使用资源: alter system enable restricted session;
5).查看系统当前的进程(最大连接数):show parameter processes;
6).设置job_queue_processes=0杀掉CJQ0及相应job进程: alter system set job_queue_processes=0;
7).修改参数alter system set aq_tm_processes=0;
8).更改数据库为open方式:alter database open;
9).更改字符集:alter database character set us7ascii;
a).*在这里,如果当前数据库的字符集是系统字符集us7asci的超集,更改不会出问题;如果不是,将会提示:
ORA-12712: 新字符集必须为旧字符集的超集
b).*如果数据库数据有CLOB类型,系统将会提示:
ORA-12716: Cannot ALTER
DATABASE CHARACTER SET when CLOB data exists
2.使用INTERNAL_USE跳过超集检测
针对以上的错误a)的解决方案:
10).ALTER DATABASE character set INTERNAL_USE us7ascii;--跳过超集检查
3.使用internal_convert转换含有CLOB字段的表
针对以上的错误b)的解决方案:
10).截断表truncate table Metastylesheet;
11).alter database character set internal_convert zhs16gbk;-- ORACLE会自动转换含有CLOB
12).因为前面清空了SYS.METASTYLESHEET表,需要重新创建
9.2通过@?/rdbms/admin/catmet.sql创建;
10g中没有catmet.sql这个脚本,通过运行catmeta.sql脚本来重建
@?/rdbms/admin/catmeta.sql
(注意这个地方有待商榷,不确定,最好不要使用这种方法修改)
4.完成方案a)和b)后再做如下步骤:
1).查看当前字符集,确认是否正确修改;
2).解除限制其它用户连接数据库使用资源: alter system disable restricted session;
3).最好也也设置一下set NLS_LANG
4).关闭数据库再打开;
*以上内容通过参考整理而来,已经通过实践验证!
不求十全十美,但求问心无愧
1)oracle 10g
二、问题描述
Oracle数据库中文字符出现乱码,所以的中文字符显示’?’符号
三、原因分析
Oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库。
四、解决方案
需要修改数据库字符集为'us7ascii'。
查看数据库当前数据集有两种方式:
a).select name,value$ from props$ where name like '%NLS%',其中NLS_CHARACTERSET所对应的为当前数据库的字符集;
b).select userenv('language') from dual;
1.常规方案修改数据库字符集
1).以管理员身份登录:conn sys/xxx as sysdba,或者conn / as sysdba;
2).关闭数据库:shutdown immediate;
3).以mount方式开启数据库:startup mount
4).限制其它用户连接数据库使用资源: alter system enable restricted session;
5).查看系统当前的进程(最大连接数):show parameter processes;
6).设置job_queue_processes=0杀掉CJQ0及相应job进程: alter system set job_queue_processes=0;
7).修改参数alter system set aq_tm_processes=0;
8).更改数据库为open方式:alter database open;
9).更改字符集:alter database character set us7ascii;
a).*在这里,如果当前数据库的字符集是系统字符集us7asci的超集,更改不会出问题;如果不是,将会提示:
ORA-12712: 新字符集必须为旧字符集的超集
b).*如果数据库数据有CLOB类型,系统将会提示:
ORA-12716: Cannot ALTER
DATABASE CHARACTER SET when CLOB data exists
2.使用INTERNAL_USE跳过超集检测
针对以上的错误a)的解决方案:
10).ALTER DATABASE character set INTERNAL_USE us7ascii;--跳过超集检查
3.使用internal_convert转换含有CLOB字段的表
针对以上的错误b)的解决方案:
10).截断表truncate table Metastylesheet;
11).alter database character set internal_convert zhs16gbk;-- ORACLE会自动转换含有CLOB
12).因为前面清空了SYS.METASTYLESHEET表,需要重新创建
9.2通过@?/rdbms/admin/catmet.sql创建;
10g中没有catmet.sql这个脚本,通过运行catmeta.sql脚本来重建
@?/rdbms/admin/catmeta.sql
(注意这个地方有待商榷,不确定,最好不要使用这种方法修改)
4.完成方案a)和b)后再做如下步骤:
1).查看当前字符集,确认是否正确修改;
2).解除限制其它用户连接数据库使用资源: alter system disable restricted session;
3).最好也也设置一下set NLS_LANG
4).关闭数据库再打开;
*以上内容通过参考整理而来,已经通过实践验证!
不求十全十美,但求问心无愧
相关文章推荐
- Oracle10g更改数据库字符集
- oracle更改数据库字符集编码!
- 手工更改数据库字符集
- 更改Oracle10g服务端字符集
- MySQL之对数据库库表的字符集的更改
- 使用oracle自带工具DMU 更改数据库字符集
- [oracle10g] 更改字符集AL32UTF8为ZHS16GBK .
- 安装oracle10G注意事项以及修改数据库字符集编码
- oracle 10g 数据库字符集更改
- [转]oracle更改数据库字符集编码
- 更改数据库字符集
- Linux下Oracle10g创建数据库过程中字符集的选择
- Postgres 数据库字符集更改 ERROR: new encoding (UTF8) is incompatible
- oracle10g更改字符集WE8ISO8859P1为ZHS16GBK
- jdbc操作非中文字符集oracle数据库导致的中文字符读写乱码的解决方案
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)-数据库设计
- Oracle10GODP连接11G数据库,出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
- oracle10g只导出某个用户所拥有的数据库表
- mysql 数据库更改引擎
- 数据库:在修改表结构的时候提示不允许保存更改的解决方法