`
zgqynx
  • 浏览: 1370933 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle数据库字符集转换规律全面剖析

阅读更多
原文:http://bbs.cnw.cn/viewthread.php?tid=52912
Oracle数据库字符集转换规律全面剖析

作为一个Oracle数据库的用户,对于Export和 Import两个命令绝对不会感到陌生,因为这二者正是我们经常用于数据备份和恢复的工具。但在使用这两个命令过程中所发生的Oracle字符集问题,常给一些Oracle使用者带来不必要的麻烦和不必要的数据损失。本文将就Export和Import过程中Oracle字符集的转换规律及使用这两个命令的注意事项做一总结。 字符集转换的原因    Export、Import过程如上图所示,从这个示意图中可以看到有四处关系到字符集,而这四处字符集的不一致恰恰是导致Oracle进行字符集转换的原因。 * 源数据库字符集; * Export过程中用户会话字符集; * Import过程中用户会话字符集; * 目标数据库字符集。在Export和Import过程中,如果存在影响字符集转换的四因素不一致,则可能发生Oracle字符集转换,即:在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出的二进制格式Dmp文件的头部几个字节中存储 Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。 例1: 如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是8位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,即这种转换后生成的Dmp文件已经发生了数据丢失。 例2: 如果源数据库使用ZHS16GBK,而Export用户会话字符集使用ZHS16CGB231280,但由于ZHS16GBK字符集是 ZHS16CGB231280字符集的超集,这个过程中绝大部分字符都能够正确转换,只有一些超出ZHS16CGB231280字符集的字符变为“?? ”形式。如果源数据库使用ZHS16CGB231280字符集,而Export用户会话使用ZHS16GBK字符集,则转换过程能够完全转换成功。在Import向目标数据库转换过程中,其字符集发生转换的情况正好与Export过程相反,这里不再详述。在Export导出的Dmp文件中,含有Export用户会话字符集。在Import过程中,首先发生的是Dmp文件字符集(即Export用户会话字符集)向Import用户会话字符集的转换。如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。 进行字符集的正确转换 通常情况下,我们在使用Oracle的Export和Import过程中,并不希望发生字符的转换,但有时这种转换却是必要的。如我们在安装Oracle 数据库时,选择ZHS16CGB231280字符集,由于这种字符集是一种中文小字符集,对于一些汉字不能够正确表示,这需要通过使用ZHS16GBK字符集得到解决,此时就要进行字符集的转换。为了确保Export、Import过程中,Oracle字符集不发生转换或正确转换,建议最好在进行这个过程前,检查一下源数据库字符集与Export 用户会话字符集是否一致,源数据库字符集与目标数据库字符集是否一致,目标数据库字符与Import用户会话字符集是否一致。如果能够保证这四个字符集是一致的,则在Export、Import过程中,Oracle字符集就不用发生转换。 可用以下办法检查数据库字符集: 通过InitXXXX.ora文件进行查看; 借助SQL语句查看: SELECT NAME,VALUE$ FROM SYS.PROPS$ WHERE NAME=‘NLS_CHARACTERSET’。对于Export、Import用户会话字符集,在Windows系统中也可以通过注册表中的NLS_LANG进行查看或修改,对于Unix系统则可通过设置用户的环境变量NLS_LANG来查看或修改。特别要注意的是,Oracle数据库字符集通常是在创建时确定,一旦存储用户数据后就不要再修改了,因为其数据都是使用该字符集进行存储的,改换其他字符集之后,原有数据就不能够正确表示了。但如果确实想进行字符集改变,则可通过以下几步来实现:备份数据库后删除原数据(可物理备份,如使用Export,请注意确保字符集不发生转换或数据无损失);使用Internal用户更新sys.props$表中的字符集:
Update sys.props$ set name=‘Dest.CharSet’ Where name=‘NLS_CHARACTERSET’; COMMIT;
重启数据库; 恢复数据。 下面字符集之间的转换是可行的:字符集子集向字符集父集转换是可行的,如ZHS16CGB231280向ZHS16GBK转换;而字符集父类向字符集子集进行转换时,会损失部分数据。只包含英文字符数据的双字节字符集也可向单字节字符集转换,如ZHS16GBK(English Only)可以向US7ASCII正确转换。编码范围相同的单字节字符集之间通常可以进行相互转换。请注意,这里所说的没有数据损失,是指一种字符集A转换成另一种字符集B之后,可以再从字符集B正确转换成字符集A或字符集B能够正确表示字符集A中转换过来的数据。

顶部
路由
高级职员
Rank: 3


UID 36695
精华 0
积分 167
帖子 329
威望 0
网币 464
推广 0
阅读权限 1
注册 2007-5-27
状态 离线

#2
  大 中 小
使用道具 
发表于 2007-6-5 10:52  资料  个人空间  短消息  加为好友
字符集对程序的影响

根据一个字符需要多少位字节来表示,可以把字符集分为单字节字符集和多字节字符集。其中,单字节字符集又分为7位字符集和8位字符集。单字节7位编码字符集有US7ASCⅡ,单字节8位编码字符集有符合ISO 8859-1标准规定的WE8ISO8859P1等。多字节编码又分为固定长度(长度大于或等于2)编码模式和不固定长度编码模式。多字节编码字符集中的 ZHS16GBK、ZHS16CGB231280、JA16SJIS等是采用两个字节表示一个字符的字符集,又叫双字节字符集。

一个英文字母是一个字符,一个中文汉字是几个字符呢?我们知道,一个中文汉字是双字节字符,但它有几个字符与其数据库字符集有关。如果数据库字符集使用单字节US7ASCII,则一个中文汉字是二个字符;如果数据库字符集使用双字节字符集ZHS16GBK,则一个中文汉字是一个字符。有关这一点可以使用 Oracle的函数Substr得到证明。

使用US7ASCⅡ字符集时:

Select substr(‘东北大学’,1,2) from dual;

语句执行结果返回‘东’。

使用ZHS16GBK字符集时:

Select substr(‘东北大学’,1,2) from dual;

语句执行结果返回‘东北’。

选择合适的数据库字符集

选择数据库字符集时应考虑以下事项:

1.数据库需要支持什么语言

在为数据库选择字符集时,常会发现几种字符集都适合你当前语言需求,如简体中文就有ZHS16GBK和ZHSCGB231280等字符集可供选择,应选择哪种?在选择字符集时,应考虑到数据库将来的系统需求。如果知道将来数据库要扩展支持不同的语言,选择一个范围较广的字符集会是一个更好的主意。

2.系统资源与应用之间的互作用性

选择的数据库字符集应保证操作系统与应用之间的无缝连接。如果选择的字符集不是操作系统有效的字符集,则系统就需要在这两者之间做字符转换。在这种字符转换过程中,就有可能发生一些字符丢失现象。从一种字符集A向另一种字符集B转换过程中,A中的字符必须在B中可以找到等价的字符,否则就会以“?”来代替。从这个意义上说,如果两种字符集编码范围是相同的,则可以相互转换。

字符集转换过程中会影响系统性能,因此,应保证客户端和服务器端有相同的字符集以避免字符集转换,也可以提高一定的系统性能。

3.系统的性能要求

不同的数据库字符集对于数据库的性能是有一定影响的。为了得到最好的数据库性能,选择的数据库字符集应避免字符转换,并且要选择对于期望的语言有最高效的编码效率。通常,单字节字符集比多字节字符集有更优的性能表现,在空间需求方面也更小些。

4.其他一些限制

在为数据库选择一个合适的字符集时,应参考Oracle对应版本的相关文档,检查Oracle对于一些字符集的限制。如Oracle 8.1.5版本中,以下字符集是不能使用的: JA16EUCFIXED、ZHS16GBKFIXED、JA16DBCSFIXED、KO16DBCSFIXED、ZHS16DBCSFIXED、 JA16SJISFIXED、ZHT32TRISFIXED。

综上所述,正确理解Oracle字符集的转换过程,可以使我们避免不必要的麻烦和数据损失。合理利用Oracle字符集的转换过程,也可以帮助我们正确地从一种字符集转换到另一种字符集,以满足我们各种不同的应用需求。
分享到:
评论

相关推荐

    Oracle数据库字符集问题解析.pdf

    本文从字符集的基本概念入手,介绍了字符集配置及查询的方法,分析了字符集出现问题的原因,阐述了数据库字符集转换的具体方法和步骤,并提出了进行字符集转换的建议。 字符集问题在 Oracle 数据库管理系统中具有...

    Oracle数据库字符集问题分析及解决方法.pdf

    Oracle数据库字符集问题主要涉及到数据的正确显示、迁移和转换,是数据库管理和使用中的关键因素。Oracle数据库为了支持多种语言文字的显示,设置了字符集,包括服务器端和客户端的字符集。若两者不匹配,可能导致...

    字符集不同的Oracle数据库间交换数据的解决方法.pdf

    由于各种原因,HIS与医保采用的Oracle数据库字符集不同,从而使得数据库间的数据交换遇到很大的困难。医院HIS数据库采用的字符集为US7ASCII,而医保软件采用的字符集是ZHS16GBK。这两种字符集的不同,使得数据库间的...

    Oracle数据库字符集问题分析及解决方法 (1).pdf

    Oracle数据库字符集问题分析及解决方法主要关注的是在数据库操作,特别是数据迁移过程中可能出现的字符编码不兼容问题。字符集是数据库系统中用于表示和存储文本数据的关键组成部分,不同的字符集支持不同的语言和...

    对Oracle数据库字符集若干问题的探讨.pdf

    黄健泉的文章《对Oracle数据库字符集若干问题的探讨》深入分析了Oracle数据库中广泛使用的中文字符集和Unicode字符集。Unicode是一种国际标准,旨在统一世界上所有的字符编码,包括各种语言的字母、数字和符号,确保...

    Oracle 修改字符集

    ### Oracle 修改字符集 在Oracle数据库管理中,有时我们需要更改...通过以上步骤,我们可以安全地完成Oracle数据库字符集的修改。这不仅可以提高数据库的兼容性和性能,还可以帮助解决由字符集不匹配引起的各种问题。

    Oracle数据库字符集问题的研究.pdf

    Oracle数据库字符集问题主要涉及到数据库内部和客户端之间的字符编码匹配问题,这直接影响到包含中文字符的数据能否正确显示和处理。字符集的选择和配置是Oracle数据库管理和维护中的关键环节,尤其对于处理多语言...

    Oracle数据库系统的字符集转换问题分析.pdf

    在Oracle数据库的日常使用中,字符集转换问题是一个常见且重要的议题。字符集是数据库系统处理和存储字符的基本规则,对于多语言环境的数据处理至关重要。 Oracle数据库系统分为国家字符集和数据库字符集两种。国家...

    jdbc连接oracle字符集不同出现乱码

    当使用 JDBC 从远程 Oracle 数据库提取数据时,如果远程数据库使用的是 `US7ASCII` 字符集,而本地应用期望的数据字符集为 `ZHS16GBK`,则在读取过程中会因字符集转换错误而导致乱码。这是因为 Java 在处理字符串时...

    ORACLE数据库查看更改字符集实战.doc

    这通常是由于数据库字符集与应用中使用的字符集不匹配造成的。 ##### 原因分析 该文档进一步揭示了问题的根本原因在于数据库的默认字符集设置。文档中提到,在安装ORACLE数据库时,默认选择了`ALU32UTF8`这一字符集...

    影响Oracle汉字显示的字符集分析

    这种情况下,可能需要重新输入数据或者通过数据库迁移工具进行字符集转换。 解决这些问题的关键步骤包括: 1. **检查服务器端字符集**:通过SQL查询V$NLS_PARAMETERS表获取。 2. **配置客户端字符集**:在安装时...

    熟知Oracle字符集

    - **数据库字符集**(Database Character Set):定义了数据库中存储数据的字符集。 - **国家字符集**(National Character Set):定义了用于存储长字符串和多字节字符的字符集。 - **排序规则**(Collation):...

    Oracle数据库管理

    - **NLS_LANG字符集与数据库字符集不同**: 当客户端的NLS_LANG设置与数据库的字符集不匹配时,可能会出现乱码现象。 - **NLS_LANG字符集和数据库字符集相同**: 即使两者字符集相同,如果编码方式不一致也可能导致...

    如何更改Oracle字符集.doc

    Oracle字符集的更改是一个复杂的过程,涉及到数据库的底层结构和数据的...在没有专家指导的情况下,自行进行字符集转换需要承担可能的数据损失风险。因此,除非必要,否则应尽量避免这种操作,或者寻求专业的技术支持。

    解决不同字符集数据库间的数据同步问题

    本文的描述部分提到了utl_raw_cast_to_raw和utl_raw_cast_to_varchar2两个函数,这两个函数都是Oracle数据库中用于字符集转换的函数。utl_raw_cast_to_raw函数用于将字符串转换为原始二进制数据,而utl_raw_cast_to_...

    oracle数据库乱码问题解决

    本文将针对Oracle数据库中的乱码问题进行详细的分析,并提供相应的解决方案。 #### 二、乱码产生的原因 1. **客户端与服务器端字符集不一致**:这是最常见的原因之一。当客户端与服务器端使用的字符集不同时,就...

    解决Oracle中文乱码.pdf

    4. 转换字符集:使用 Oracle 的字符集转换工具,例如 `CONVERT` 语句,来将错误的字符集转换为正确的字符集。 四、结论 Oracle 字符集是 Oracle 数据库中一个非常重要的概念,正确的字符集设置可以确保数据的正确...

Global site tag (gtag.js) - Google Analytics