`

Oracle数据库字符集的查询方案介绍1

阅读更多

Oracle 数据 库字符集通俗的讲就是一个字节数据的相关的解释的符号集合,它具有大小的差异,也有互相包容关系。Oracle是支持国家语言的相关体系结构,它允许你使 用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。

影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下:

  1. NLS_LANG = language_territory .charset  

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:

Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK。

从NLS_LANG的组成我们可以看出,真正影响Oracle数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

如何查询Oracle的字符集

很多人都碰到过因为字符集不同而使数据导入失败的情况。这涉及三方面的字符集,一是Oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在做数据导入的时候,需要这三个字符集都一致才能正确导入。

1、查询Oracle Server端的字符集:

有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:

  1. SQL > select userenv(‘language’) from dual;  

结果类似如下:AMERICAN _ AMERICA. ZHS16GBK。

2、如何查询dmp文件的字符集:

用Oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比 如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

  1. SQL > select nls_charset_name(to_number('0354','xxxx')) from dual;   
  2. ZHS16GBK   

如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

  1. cat exp.dmp  od -x head -1 awk '{print $2 $3}' cut -c 3-6  

然后用上述SQL也可以得到它对应的字符集。

3、查询Oracle client端的字符集:

这个比较简单。在Windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在Dos窗口里面自己设置,比如:

  1. set nls_lang = AMERICAN_AMERICA .ZHS16GBK  

这样就只影响这个窗口里面的环境变量。 在Unix平台下,就是环境变量NLS_LANG。

  1. $echo $NLS_LANG   
  2. AMERICAN_AMERICA.ZHS16GBK   

如果检查的结果发现Server端与Client端字符集不一致,请统一修改为同Server端相同的字符集。

修改Oracle的字符集

Oracle的字符集有互相的包容关系

如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。

一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符 集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库 server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集 的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和 ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。

修改Server端字符集(不建议使用):

在Oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但Oracle8之后,至少有三张系统表记录了Oracle数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

  1. $sqlplus /nolog   
  2. SQL > conn / as sysdba;   

若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

  1. SQL > STARTUP MOUNT;   
  2. SQL > ALTER SYSTEM ENABLE RESTRICTED SESSION;   
  3. SQL > ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0 ;   
  4. SQL > ALTER SYSTEM SET AQ_TM_PROCESSES = 0 ;   
  5. SQL > ALTER DATABASE OPEN;   
  6. SQL > ALTER DATABASE CHARACTER SET ZHS16GBK;   
  7. SQL > ALTER DATABASE national CHARACTER SET ZHS16GBK;   
  8. SQL > SHUTDOWN IMMEDIATE;   
  9. SQL > STARTUP   

修改dmp文件字符集:

上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论 上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如 US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。

具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:

  1. SQL > select to_char(nls_charset_id('ZHS16GBK'),   
  2. 'xxxx') from dual;   
  3. 0354   

然后将dmp文件的2、3字节修改为0354即可。

如果dmp文件很大,用ue无法打开,就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。我在Windows下测试通过。但要求Oracle数据库一定要安装JVM选项。

分享到:
评论

相关推荐

    oracle数据库字符集 无法修改数据库字符集 乱码

    本文将深入探讨Oracle数据库字符集的概念、重要性、修改过程及其潜在问题,特别是当尝试修改数据库字符集时遇到的乱码问题。 ### Oracle数据库字符集概述 Oracle数据库字符集是指用于表示数据库中所有字符数据的...

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

    Oracle 数据库字符集问题解决方案大全 Oracle 数据库字符集问题解决方案大全中,提出了 Oracle 数据库汉字显示异常的解决方案。该文档涵盖了字符集的概念、字符集的设置、字符集的影响因素、解决汉字显示异常的...

    理解ORACLE数据库字符集

    【Oracle数据库字符集详解】 Oracle数据库字符集是其全球化支持(Globalization Support)的一部分,旨在为用户提供本地化的数据存储和处理环境。字符集是字符编码的集合,它为每个特定的符号分配一个唯一的数值...

    理解Oracle数据库字符集

    Oracle数据库字符集是其全球化支持(Globalization Support)的核心组成部分,也称为国家语言支持(NLS),目的是为了适应不同国家和地区用户的语言环境,包括日期、数字格式和特殊字符的存储和处理。Oracle提供了...

    Oracle数据库字符集问题总结

    Oracle数据库字符集问题是一个常见的技术挑战,特别是在处理多语言数据或者需要与不同系统交互时。字符集决定了数据库如何存储和显示字符,不匹配的字符集可能导致数据乱码,影响正常功能。以下是对这个问题的深入...

    ORACLE数据库字符集[参考].pdf

    Oracle数据库字符集是Oracle全球化支持的核心组成部分,它允许数据库系统以用户本地的语言和格式存储、处理和检索数据。Oracle提供了广泛的语言和字符集支持,从早期的Oracle8i的48种语言和229种字符集,到Oracle9i...

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

    ### JDBC 连接 Oracle 字符集不同导致乱码问题解析及解决方案 #### 问题背景 在使用 JDBC(Java Database Connectivity)连接 Oracle 数据库时,可能会遇到一个常见的问题:从远程 Oracle 数据库获取的数据出现乱码...

    oracle 中文字符集问题

    - **查询当前数据库字符集**:可通过查询`v$nls_parameters`视图来获取数据库的字符集设置。 - **修改数据库字符集**:更改数据库字符集是一个复杂的过程,通常需要通过备份和恢复的方式完成,或使用`ALTER DATABASE...

    oracle字符集的查看和client字符集的修改

    在Oracle数据库系统中,字符集(charset)是用于表示文本数据的编码方式。正确设置和管理字符集对于确保数据的一致性和正确性至关重要。Oracle支持多种字符集,包括单字节字符集(SBCS)、多字节字符集(MBSCS)以及...

    Oracle 数据库多语言入库问题的解决方案

    Oracle 数据库多语言入库问题的解决方案是针对企业在国际化进程中遇到的多国语言信息存储难题,尤其是在使用Oracle数据库时,由于字符集的不兼容性导致非中文语言数据入库时出现乱码。Oracle数据库作为全球广泛使用...

    Oracle字符集专题

    Oracle字符集专题是一个深入探讨Oracle数据库字符集配置、管理和常见问题解决的综合资源。这个专题涵盖了从基础概念到实际操作的多个方面,旨在帮助用户全面理解并有效处理与Oracle字符集相关的各种问题。 首先,...

    Oracle_字符集的查看和修改

    修改数据库字符集是一项复杂且风险较高的操作,通常不建议在生产环境中执行。如果确实需要进行这样的操作,可以通过 Oracle 提供的工具或脚本来实现。具体步骤包括: 1. **备份数据库**: 在修改之前,务必先备份...

    oracle数据库中文乱码问题解决方案.docx

    Oracle数据库中文乱码问题解决方案 Oracle数据库中文乱码问题是指在Oracle数据库中,中文字符无法正确显示或出现乱码的问题。这种问题通常是由于数据库服务器端和客户端字符编码设置不正确引起的。本文将提供一个...

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

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

    医院信息系统Oracle数据库更换字符集的技术实践.pdf

    本实践探讨的是将医院的“军卫一号”HIS及其相关系统的Oracle数据库字符集从US7ASCII更改为ZHS16GBK,以更好地支持中文字符的存储和检索。 1. 更换字符集的原因: US7ASCII字符集主要支持英文字符,对于中文环境下...

    Oracle数据库迁移升级详细步骤.docx

    RAC(Real Application Clusters)是Oracle数据库的一种高可用性解决方案,可以将多个节点组成一个集群,以提高数据库性能和可用性。RAC 数据库安装包括: * 安装 RAC 数据库软件:安装 RAC 数据库软件,包括数据库...

    imp exp字符集解决方案

    影响Oracle数据库字符集的主要参数是NLS_LANG,它由三部分组成:语言、地域和字符集。语言部分决定服务器消息的语言,地域部分设定日期和数字格式,而字符集部分则直接影响数据的存储和解析。例如,"AMERICAN_...

Global site tag (gtag.js) - Google Analytics