千家信息网

修改oracle字符集

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,一 修改数据库SERVER端字符集数据库字符集在创建后原则上不能更改。如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHAR
千家信息网最后更新 2026年11月02日修改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
字符 字符集 数据 数据库 客户 超集 客户端 子集 方法 环境 检查 之间 端的 支持 参数 变量 后果 命令 就是 平台 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 互联网科技园 互联网科技海报 互联网是第几次科技革命的成果 互联网和科技创新 科技类互联网 网络科技有限互联网 北京互联网科技有限公司 互联网金融公司科技 互联网科技大会 四川狮子座互联网科技 剑昆互联网络科技有限公司临桂 昭通互联网科技选哪家 互联网科技革命什么开始 梅州GM互联网络科技有限公司 广州千川互联网科技有限公司 互联网科技包装股份有限公司上市 山东大美朱楼互联网科技有限公司 上海同邻互联网科技有限公司规模 上海万顺科技互联网有限公司招聘 保险科技 互联网保险 为想互联网科技怎么样 互联网科技的发展 碳银互联网科技有限公司 海南购全球互联网科技 汉立互联网科技有限公司联系电话 深圳前海聚择互联网科技有限公司 郑州欣桑互联网科技有限公司 南京一网一红互联网科技有限公司 保山浩联互联网科技有限公司
0