国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长度存储一个汉字。UTF8字符集是多字节存储,1个汉字(简体、繁体)有时采用3个字符长度存储。

Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是说UTF8是ZHS16GBK的严格超集。
对于子集到超集的转换,Oracle是允许的,但是对于超集到子集的转换是不允许的。一般对于超集到子集的转换,建议是通过dbca删除原来的数据库,重新再建库,选择正确的字符集,然后导入备份。
我的方案是:先备份数据,然后强制转换字符集从UTF8到ZHS16GBK,然后导入备份数据。如果不行,才来重新建库,设置字符集ZHS16GBK,导入备份数据。如果这还不行,就把更改字符集从ZHS16GBK到UTF8(这是安全的),再导入备份数据,恢复到原始状况。这样就有可能避开重新建库的麻烦。

1. 备份数据库中所有用户的数据
以oracle用户登陆,执行以下命令
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
保持与数据库服务器端一致,这样在exp导出时,就不会存在字符的转换了,备份最原始的数据。
2. 评估UTF8转换成ZHS16GBK的风险
转换之前,要使用Oracle的csscan工具对数据库扫描,评估字符集转换前后,数据有可能的损坏情况。如果评估情况糟糕,那就绝对要放弃了。
先安装属于 CSMIG 用户的一套表和过程。以oracle用户登陆UNIX,
#sqlplus “/ as sysdab”
SQL>@$ORACLE_HOME/ rdbms/admin/csminst.sql
SQL>exit
# $ORACLE_HOME\bin\csscan -help
可以更清楚如何使用csscan。
# $ORACLE_HOME/bin/csscan system/sunday user=mmsc FROMCHAR=UTF8 TOCHAR=ZHS16GBK ARRAY=102400 PROCESS=3 > csscan.log
以上命令意思是扫描用户:mmsc中的所有数据,从字符集UTF8更改为ZHS16GBK的转换情况。然后得到三个文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用户下的所有的数据都是可以转换的,并且没有出现转换“Exceptional”的情况,因此可以更放心一点。
3. 更改数据库的字符集为ZHS16GBK
前面说过,通过命令“Alter Database Characeter Set XXXX”,实现从超集到子集的转换,在Oracle是不允许的。但是该命令,提供这样的命令方式:
Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX
这是Oracle的非公开命令。“在使用这个命令时,Oracle会跳过所有子集及超集的检查,在任意字符集之间进行强制转换,所以,使用这个命令时你必须十分小心,你必须清楚这一操作会带来的风险”。
以oracle用户登陆UNIX,
#sqlplus “/ as sysdba”
SQL> SHUTDOWN IMMEDIATE; 
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> ALTER DATABASE CHARACTER SET ZHS16GBK; 
//如果不使用“INTERNAL_USE”参数,系统会提示出错:
//ERROR at line 1:
//ORA-12712: new character set must be a superset of old character set
SQL> ALTER SESSION SET SQL_TRACE=FALSE;
SQL> SHUTDOWN IMMEDIATE; 
SQL> STARTUP;
此时,检查一下数据库的字符集是否更改过来
SQL> select value$ from props$ where name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
紧接着检查一下数据库中简体中文、繁体中文是否正常,不会出现乱码。
SQL>select spid,spname,spshortname from spinfovisual_hk 
…...
非常不幸,我看到了一堆乱码,这也证明了Oracle不支持字符集从超集到子集的更改,当时心里很紧张,很怕失败,从而恢复到原样。
但是根据以前的验证,把UTF8下的备份导入到ZHS16GBK中去,是OK的,所以继续尝试。
4. 导入备份的用户数据
还是以oracle用户登陆UNIX, 先删除库中的用户mmsc:
#sqlplus “/ as sysdba”
SQL>drop user mmsc cascade;
SQL>exit
再运行createuser.sql,生成mmsc用户。
然后使用原来的备份文件,导入到mmsc用户中:
注意:先设置NLS_LANG要与当前数据库的一致:ZHS16GBK。这样,导出时用户会话的NLS_LANG为UTF8,与原先的数据库字符集一致;现在为ZHS16GBK,与此时的数据库字符集一致。这样,导入时,就会进行字符转换。
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
#imp mmsc/mmsc@mdspdb file=DSMPD113_user_mmsc.dmp ignore=y fromuser=mmsc touser=mmsc
马上查看数据库中简体、繁体中文,哈哈,没有乱码了,一切显示正常。
紧接着进行验证,也证明了:1个汉字此时只占用2个字符长度。问题解决了!

转载于:https://blog.51cto.com/aixuexi/939990

修改Oracle数据库字符集相关推荐

  1. oracle设置字符集为gbk,rac 环境下修改oracle数据库字符集为GBK

    1.查询当前的字符集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') ----------------------- ...

  2. 查看修改oracle数据库字符集

    数据库服务器字符集select * from nls_database_parameters; 8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props ...

  3. 修改 oracle 字符 zhs,修改Oracle数据库的字符集(UTF8→ZHS16GBK)

    修改Oracle数据库的字符集(UTF8→ZHS16GBK) 1.  C:\Users\Administrator>sqlplus /nolog 2.以sysdba的身份登录上去 SQL> ...

  4. oracle数据库字符集AL32UTF8修改为ZHS16GBK即从超集到子集

    转自:https://www.cnblogs.com/perilla/p/3873653.html 一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的 ...

  5. linux 查看oracle数据库字符集,Oracle字符集的查看查询和Oracle字符集的设置修改

    三. 修改Oracle的字符集 8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误. Startup nomount; A ...

  6. oracle 字符集修改方案,Oracle数据库字符集问题解决方案大全

    在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比 较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉 字信息的显示方面着实给中国用户带来不少麻烦,笔 ...

  7. 理解ORACLE数据库字符集

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

  8. oracle客户端改字符集没有用,ORACLE客户端乱码 修改Oracle客户端字符集

    修改Oracle客户端字符集方法: 1:可以通过修改注册表键值永久设置,类似于这样的键值: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0下, 如一般的简体中文 nl ...

  9. Oracle数据库字符集问题解决方案大全

    在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多 ...

最新文章

  1. python heapq模块使用
  2. linux命令行引导iso,如何在Linux上使用命令行从可启动ISO创建可启动USB?
  3. android view getx 0,Android动画:解决通过View.getY()获取初始位置为0的问题
  4. QMarkDowner编译
  5. Dom4j完整教程~属性相关
  6. MySQL重启也无法解决的Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. 《2019年数据及存储发展研究报告》十大洞察
  8. 新浪微博放开140字限制:社交向左 原创向右
  9. JCGridMenu
  10. 在数据中心里SDN技术发展现状
  11. 自己动手源码包制作rpm 包 (二)
  12. 重装SPS 2003的一点经验
  13. Mac AE2018软件安装及破解
  14. vim 的配置详解/键盘映射配置详解
  15. C/C++和Lua混合编程
  16. element UI-远程搜索(el-select)
  17. PS安装插件提示无法加载扩展未正确签署解决方式(适用于mac/win)
  18. 东芝21vf6c_东芝开发21寸高清裸眼3D立体液晶屏
  19. 忆阻器课题 读书笔记(二)
  20. MFC六大核心机制之一MFC程序的初始化

热门文章

  1. VTK:Texture之TexturedSphere
  2. VTK:PolyData之KochanekSpline
  3. VTK:图片之InteractWithImage
  4. OpenCV图像金字塔pyrDown和pyrUp的实例(附完整代码)
  5. OpenCV hdr成像技术的实例(附完整代码)
  6. Qt Creator测验Testing
  7. C语言二叉搜索树返回key的树级(附完整源码)
  8. OpenGL 实例化属性的实例
  9. C++STL的 list容器
  10. python求两数最大公因数_『用python求俩个数的最大公约数和最小公倍数』