Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。一般来说,数据库字符集在安装数据库实例时就指定好了,而且不建议安装完成后修改数据库字符集,理论上是不能改变的。如果确实存在字符兼容性的问题,数据库字符集也是可以修改的。

Oracle的字符集命名遵循以下命名规则: <Language><bit size><encoding> 即: <语言><比特位数><编码>,Language指定服务器消息的语言,territory指定服务器的日期和数字格式,charset指定字符集。如CHINESE_CHINA.ZHS32GB18030。

数据库字符集设计三个方面:(1)server端 (2)client端 (3)dmp文件

  查看server端字符集方法:

1)SELECT * FROM Nls_Database_Parameters;

2)SELECT Userenv('language') FROM Dual;

查看client端字符集方法:

Windows方法:

C:\Users\zhang>SET NLS_LANG
           NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

Unix方法:echo $NLS_LANG

   查看dmp文件字符集:

oracle的exp工具导出的dmp文件也包含了字符集信息。dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

SQL>SELECT Nls_Charset_Name(To_Number('0354', 'xxxx')) FROM Dual;
NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'
----------------------------------------
ZHS16GBK

如果dmp文件很大如2G以上,可以用以下命令查看(在unix主机上): cat dbexp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

一、修改单实例的数据库字符集

接下来以数据库的字符集从ZHS16GBK修改为 ZHS32GB18030为例。

操作步骤如下:

--停监听
lsnrctl stop
--关闭数据库
SQL>shutdown immediate;
--开启数据库到mount状态
SQL>startup mount ;
--SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
--sql_trace =true在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用,这个参数在10g之后是动态参数,可以随时调整,在某些诊断中非常有效。
--提示: 通过在全局启用sql_trace,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程之间的紧密协调.
SQL>alter session set sql_trace=true;
--ALTER SYSTEM DISABLE RESTRICTED SESSION来取消数据库的受限制状态。在数据库受限制的过程中,只有对数据库拥有CREATE SESSION权限的用户才能够连接到数据库。这种状态有利于对数据库进行备份,恢复,导入,导出等操作。
SQL>alter system enable restricted session;
--首先设置JOB_QUEUE_PROCESSES=0,Oracle会杀掉CJQ0及相应job进程
SQL>alter system set job_queue_processes=0;
--aq_tm_processes值可选在1到10之间,0代表是关闭队列监视
SQL>alter system set aq_tm_processes=0;
--利用INTERNAL_USE 关键字修改区域设置,目的是让Oracle数据库绕过了子集与超集的校验
SQL>alter database character set INTERNAL_USE ZHS32GB18030;
--打开数据库
SQL>alter database open;
--再次关闭数据库
SQL>shutdown immediate ;
--再次打开数据库
SQL>startup ;
SQL>SET linesize 200
SQL>SELECT *
  FROM Nls_Database_Parameters a
WHERE a.Parameter = 'NLS_CHARACTERSET';
SQL>SELECT '张王李赵' from dual;

二、修改RAC环境下的数据库字符集

Oracle11gR2中RAC环境下修改数据库字符集方法:

(1) 停监听
ps -ef |grep pmon
lsnrctl stop
(2) 停所有实例
cd $ORACLE_HOME/crs_1/bin
./srvctl stop database -d testdb
或者使用
./srvctl stop instance -d testdb -i rac1
./srvctl stop instance -d testdb -i rac2
(3) 查看集群状态
crs_stat -t
(4) 只能在一个节点上操作,如rac1,否则会报ORA-12720错误,意为此操作只能在单实例下操作。
startup
(5) 先将数据库置于非集群状态
alter system set cluster_database=false scope=spfile sid='testdb';
(6) 修改数据库字符集
shutdown immediate;
startup mount;
alter session set sql_trace=true;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database character set INTERNAL_USE ZHS32GB18030;
(7) 再将数据库置于集群状态
alter system set cluster_database=true scope=spfile;
(8) 关闭数据库
shutdown immediate;
(9) 先启动一个节点进行验证,各节点都需要进行验证。
startup
sqlplus / as sysdba
SELECT '张王李赵' FROM Dual;
(10) 恢复集群状态
./srvctl start database -d testdb
(11) 查看集群状态
crs_stat –t

在数据库安装部署时需要考虑数据库字符集的问题,最好在安装实例时就设置好,不建议后续对数据库字符集进行修改。

Oracle数据库字符集修改的更多相关文章

  1. linux下oracle数据库字符集修改

    linux下oracle数据库字符集修改 0.RHEL6.7.oracle11gr2 1.登录oracle.在安装oracle的用户下进入数据库. $ sqlplus / as sysdba 2.查询 ...

  2. oracle数据库字符集的修改

    本文摘自:http://blog.csdn.net/nsj820/article/details/65711051.改客户端字符集:通过WINDOWS的运行菜单运行Regedit,修改注册表 Star ...

  3. Oracle数据库字符集问题解析

    Oracle数据库字符集问题解析 经常看到一些朋友问ORACLE字符集方面的问题,我想以迭代的方式来介绍一下.第一次迭代:掌握字符集方面的基本概念.有些朋友可能会认为这是多此一举,但实际上正是由于对相 ...

  4. ORACLE数据库字符集处理

    简介: ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,OR ...

  5. Oracle数据库字符集问题

    Oracle数据库的字符集问题,也涉及作为服务器操作系统的CentOS或者Windows的字符集与Oracle字符集之间的关联关系Oracle的字符集,这个问题的提出是因为两个原因:一是遇到一个DMP ...

  6. 选择ORACLE数据库字符集

    如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...

  7. Linux下修改Oracle数据库字符集命令

    常见情形:从服务器备份Oracle数据库后再到本地机器上还原Oracle数据库的时候经常会碰见数据库字符编码不一致的情况,可以用以下命令来修改本地的Oracle数据库字符编码,然后顺利还原Oracle ...

  8. oracle_修改Oracle数据库字符集 AL32UTF8;

    修改数据库字符集 以支持维文等  utf8 停掉库 进入装载模式 ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_ ...

  9. oracle数据库字符集

    Oracle字符集的基本原理 1. Oracle服务器字符集 oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置. 方法1 SQL> select * from v$nl ...

随机推荐

  1. C++学习基础五之函数参数——形参

    一.理论部分 C++中函数形参主要分为两类,如图1所示, 图1 总结: 一.当函数参数为非引用形参时,传进函数体内的是实参的拷贝,(注意,对于基本类型而言,拷贝的是实参的值,对于指针而言拷贝的是实参的 ...

  2. angular背景图片问题

    如果背景图片是从后台取得的数据,可以按下面的方式使用: ng-style="{'background':'url(http://xxx/{{item.id}})'}" 还需要加上  ...

  3. Jvm支持的最大线程数

    摘自 http://blog.csdn.net/xyls12345/article/details/26482387 JVM最大线程数 (2012-07-04 23:20:15) 转载▼ 标签: jv ...

  4. IOleItemContainer的接口定义

      IOleItemContainer的接口定义

  5. ORACLE数据库存储结构

    一.数据块 Oracle对数据库数据文件中的存储空间进行管理的单位是数据块.数据块是数据库中最小的(逻辑)数据单位,是最小的I/O单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节.每 ...

  6. pickle

    [pickle] Python提供了pickle模块来实现序列化. 首先,我们尝试把一个对象序列化并写入文件: pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个by ...

  7. 转 对菜鸟开发者的叮咛:花一万个小时练习Coding,不要浪费一万小时无谓地Debugging

    原文见http://blog.jobbole.com/74825/ Coding 之于科技的重要性不言可喻,也不再是软体工程师的专利,医师.律师.会计师.护理师.金融从业人员,甚至是听起来摸不着边的政 ...

  8. MySQL的错误:No query specified

    在做MySQL主从同步的时候通过: mysql> show slave status\G; *************************** 1. row **************** ...

  9. udp通信的原理---makefile文件

    由于UDP通信不需要事先建立连接,因此不需要TCP中的connect函数. 服务器端的步骤如下: 1. socket:      建立一个socket 2. bind:          将这个soc ...

  10. URLEncoder编码

    客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将网址中的非ASCII码内容转换成可以 ...