修改oracle字符集

简介: 一 修改数据库SERVER端字符集    数据库字符集在创建后原则上不能更改。如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。
一 修改数据库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
相关文章
|
3月前
|
存储 自然语言处理 Oracle
Oracle数据库字符集概述及修改方式
【8月更文挑战第15天】Oracle 数据库字符集定义了数据的编码方案,决定可存储的字符类型及其表示方式。主要作用包括数据存储、检索及跨系统传输时的正确表示。常见字符集如 AL32UTF8 支持多语言,而 WE8MSWIN1252 主用于西欧语言。修改字符集风险高,可能导致数据问题,需事先备份并评估兼容性。可通过 ALTER DATABASE 语句直接修改或采用导出-导入数据的方式进行。完成后应验证数据完整性。此操作复杂,须谨慎处理。
|
6月前
|
Oracle 关系型数据库 数据库
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
|
6月前
|
存储 Oracle 关系型数据库
Oracle系列之三:Oracle字符集
Oracle系列之三:Oracle字符集
|
SQL Oracle 关系型数据库
修改oracle数据库字符集
修改oracle数据库字符集
|
SQL Oracle 关系型数据库
oracle修改本机上数据库字符集
oracle修改本机上数据库字符集
129 0
|
Oracle Java 关系型数据库
Java操作oracle数据库提示:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK,问题处理
Java操作oracle数据库提示:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK,问题处理
886 0
|
存储 Oracle 关系型数据库
MySQL数据库: 添加列、修改列、删除列、修改列属性、修改表名(包括MySQL、SQLServer、Oracle)
MySQL数据库: 添加列、修改列、删除列、修改列属性、修改表名(包括MySQL、SQLServer、Oracle)
436 0
MySQL数据库: 添加列、修改列、删除列、修改列属性、修改表名(包括MySQL、SQLServer、Oracle)
|
Oracle 算法 关系型数据库
Oracle如何修改数据库的DBID和DBNAME?
Oracle如何修改数据库的DBID和DBNAME?
441 0
|
网络协议 Oracle 关系型数据库
Oracle rac 修改SCAN IP
Oracle rac 修改SCAN IP
740 0
|
存储 SQL 自然语言处理
一文搞懂Oracle字符集
一文搞懂Oracle字符集
1173 0