更改Oracle字符集避免乱码

如何更改Oracle字符集避免乱码

转一位大神的笔记。

国内最常用的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/[email protected] file=DSMPD113_user_mmsc.dmp ignore=y fromuser=mmsc touser=mmsc
  马上查看数据库中简体、繁体中文,哈哈,没有乱码了,一切显示正常。
  紧接着进行验证,也证明了:1个汉字此时只占用2个字符长度。问题解决了!

时间: 2024-10-26 17:56:33

更改Oracle字符集避免乱码的相关文章

如何更改Oracle字符集避免乱码

转一位大神的笔记. 国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长度存储一个汉字.UTF8字符集是多字节存储,1个汉字(简体.繁体)有时采用3个字符长度存储. Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是说UTF8是ZHS16GBK的严格超集.对于子集到超集的转换,Oracle是允许的,但是对于超集到子集的转换是不允许的.一般对于超集到子集的转换,建议是通过dbca

更改oracle字符集

修改oracle字符集 方法/步骤 oracle数据库的字符集更改 A.oracle server 端 字符集查询  select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LANGUAGE 为 server端字符显示形式 B.查询oracle client端的字符集  $echo $NLS_LANG 如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集.

关于Oracle字符集在dmp文件导入导出中的乱码影响

Oracle 在进行dmp备份和还原的时候,服务器端字符集和客户端字符集会对这个过程有较大影响,特别是数据表中存储了中文.存储过程中使用了中文编码(注释)的时候,如果没有处理好字符集的问题,在进行还原的时候就会遇到问题,我所遇到过的问题有一下几种: 1:导入后数据表中存储的中文字符成了乱码: 2:导入后存储过程中的中文字符成了乱码: 3:导入时,提示某些存储过程不存在,报IMP-00098 INTERNAL ERROR:impccr2错误: 其中问题1出现的原因是源数据库使用的字符集和你现在导入

Oracle 的字符集与乱码

字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理. 在整个运行环节中,字符集在3个环节中发挥作用: 1.软件在操作系统上运作时的对用户的显示,此时采用操作系统定义的字符集进行显示.我们在系统I/O编程的时候经常要指定字符集,C#中的Text.Encoding=Encoding.Default实际上就是告诉编译器,文本使用系统定义的默认字符集进行编码.sqlplus也是运行在操作系统上的软件,当然要使用系统所指定的字符集对外显示内容. 2.数据向Oracle服务端传送前的通告.也就是sq

Linux下更改oracle客户端字符集和服务端字符集

from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1.Linux 下更改 oracle 客户端字符集,即设置环境变量" NLS_LANG" 的值 查看客户端字符集,在终端下执行: echo $NLS_LANG 修改客户端字符集: sudo gedit /etc/environment 在environment 文件中增加以下内容: NLS_LANG="SI

oracle字符集

1.引言 ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,ORACLE为用户提供自己熟悉的数据库母语环境,诸如日期格式.数字格式和存储序列等.Oracle可以支持多种语言及字符集,其中oracle8i支持48种语言.76个国家地域.229种字符集,而oracle9i则支持57种语言.88个国家地域.235种字符集. 2.概述 2.1字符集概述 实质就是按照一

转Oracle字符集问题总结

Oracle字符集问题总结 分类: Oracle2006-06-04 13:48 1298人阅读 评论(3) 收藏 举报 oracle数据库sqlcharacter存储insert 作者: vstonet 出处: 菊花论坛 经常看到一些朋友问ORACLE字符集方面的问题,我想以迭代的方式来介绍一下. 第一次迭代:掌握字符集方面的基本概念. 有些朋友可能会认为这是多此一举,但实际上正是由于对相关基本概念把握不清,才导致了诸多问题和疑问.首先是字符集的概念.我们知道,电子计算机最初是用来进行科学计算

oracle 字符集

---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事ORACLE数据库管理,经常收到周围用户和外地用户反映有关ORACLE数据库汉字显示问题的求援信,主要现象是把汉字显示为不可识别的乱码,造成原来大量信息无法使用.本文将就这一问题产生的原因和解决办法进行一些探讨,供存在这方面问题的用户朋友参考. ---- 1.原因分析  ---- 通

Oracle数据库中文乱码问题

最近碰到Oracle乱码问题,刚开始甚是头疼,以前在合肥出差的时候,这种问题也碰到过,当时直接抛给了“乌压压一片”(一个搞数据的同事儿),这次没办法躲过,只好硬着头皮上.虽然我这次碰到的是Oracle乱码问题中的一个,但是我决定将这个乱码问题整理清楚(不整清楚,就觉得身边有个定时炸弹,怕下次整数据库的时候会突然又爆炸). 解决这个问题的关键在于理解字符集的概念,所以在正文开始之前,有必要先提一下字符集的相关知识!(这部分知识,对于解决j2ee中文参数传递过程中出现的乱码,也非常具有参考意义) 一