Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75246
  • 博文数量: 37
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 386
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-11 11:33
文章分类

全部博文(37)

文章存档

2011年(1)

2010年(30)

2009年(6)

我的朋友

分类: LINUX

2010-03-11 18:43:31

今天的话题是:
ORACLE数据库字符集的更改
ORACLE数据库字符集是困扰许多生产系统的一大问题,为避免这个问题,dba应该数据库建立初期充分考虑字符集
的选择,尽量避免上线后的数据库再做冒险的字符集更改.
当然,实际上有很大因素,会让dba不得不更改数据库的字符集,哪怕是暂时性的.
OK 那接下来看看怎么更改已经投产的数据库的字符集????
首先,了解一下字符集里面"超集"的概念
所谓超集,就是指当前字符集中的每一个字符在新字符集中都可以表示,并使用相同的代码点,比如很多字符集都是
US7ASCII的严格超集.
举例来讲,A是B的(严格)超集,意思是说,B中的每一个字符在A中都可以表示,并且在数据库内部的代码点也相同。有点儿像数学的集合一样。
更改数据库的字符集步骤如下:
1.备份
修改之前一定要为数据库备份,测试库也一样。
2.检查当前数据库的字符集
select name,value$ from props$ where name like '%NLS%';
一般数据库都是用的US7ASCII字符集,以下为US7ASCII向ZHS16GBK的更改。
3.将数据库置于RESTRICTED模式下
转换字符集,数据库应该在RESTRICTED模式下进行。
以sys用户本地登录数据库,
  a.shutdown immediate;
  b.startup mount;
  c.alter system enable restricted session;
  d.alter database character set ZHS16GBK;
SQL>
Database altered.
如果更改后的字符集不是当前字符集的超集,则显示如下错误:
alter database character set ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
4.修改数据库模式
alter system disable restricted session;
到此,已经成功转换字符集。
但是,实际上有如下可能情况:
1.在9i中,如果数据库存在CLOB类型字段,那么就不允许对字符集进行转换,即使是合法的操作。
此时,可以查看警告日志文件,看看CLOB字段存在于哪些表里。
如果是用户表,则通过导出,然后drop该表,再转换,再然后导入的方式解决。
如果是系统表,那更好解决,直接truncate该表,再转换,再通过运行catmet.sql脚本来重建该表。
2.决不能通过如下方式修改字符集
用sys用户,
update props$ set value$ ='新字符集' where name = 'NLS_CHARACTERSET';
commit;
这是个严重错误的方式,表面上成功了,其实给数据库埋下了很大隐患.切忌!切忌!
阅读(647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~