oracle数据库如何修改字符集,修改oracle字符集

Posted 韦臻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库如何修改字符集,修改oracle字符集相关的知识,希望对你有一定的参考价值。

一 修改数据库SERVER端字符集

数据库字符集在创建后原则上不能更改。如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。

对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。

特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。

1 修改server端字符集方法

在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

$sqlplus /nolog

SQL>conn / as sysdba;

若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

SQL>STARTUP MOUNT;

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;

SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP

2 修改server端字符集方法(可以跳过超集的检查)

使用INTERNAL_USE可以跳过超集的检查,ALTER DATABASE character set INTERNAL_USE 加这个以后,就可以彻底解决修改的问题,即使报错也能修改.如:

ALTER DATABASE character set INTERNAL_USE ZHS16CGB231280;

ALTER DATABASE character set INTERNAL_USE zhs16gbk;

SQL> connect sys/oracle as sysdba

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> set linesize 120;

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

# 使用INTERNAL_USE可以跳过超集的检查,ALTER DATABASE character set INTERNAL_USE

SQL> ALTER DATABASE character set INTERNAL_USE zhs16gbk;

SQL> shutdown immediate;

SQL> STARTUP

SQL> select name,value$ from props$ where name like '%NLS%';

NLS_CHARACTERSET

zhs16gbk

二 客户端字符集(NLS_LANG参数)

1 客户端字符集含义

客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。

2 查询oracle client端的字符集

这个比较简单。在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。

还可以在dos窗口里面自己设置,比如:

set nls_lang=AMERICAN_AMERICA.ZHS16GBK

这样就只影响这个窗口里面的环境变量。

在unix平台下,就是环境变量NLS_LANG。

$echo $NLS_LANG

AMERICAN_AMERICA.ZHS16GBK

如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。

3 客户端字符集设置方法

1)UNIX环境

$NLS_LANG=“simplified chinese”_china.zhs16gbk

$export NLS_LANG

编辑oracle用户的profile文件

或者是临时改变export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

2)Windows环境

编辑注册表

Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29067253/viewspace-2141543/,如需转载,请注明出处,否则将追究法律责任。

以上是关于oracle数据库如何修改字符集,修改oracle字符集的主要内容,如果未能解决你的问题,请参考以下文章

如何修改Oracle数据库字符集

oracle数据库如何修改字符集,修改oracle字符集

oracle的NLS_LANGUAGE如何修改成SIMPLIFIED CHINESE_CHINA?

如何更改Oracle字符集

如何查看和修改Oracle数据库服务器端的字符集

oracle修改字符集把utf8修改成AMERICAN _ AMERICA. ZHS16GBK