`
cqp1116
  • 浏览: 1692 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

全面认识Oracle数据库字符集

    博客分类:
  • 2011
阅读更多
什么是Oracle字符集
    Oracle字符集是一个字节数据解释的符号集合,有大小之分,有相互的包容关系。
    Oracle支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字和日历自动适应本地化语言和平台。
    影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下:
    NLS_LANG = language_territory.charset
    它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:
    Language指定服务器消息的语言,territory指定服务器的日期和数字格式,charset指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK。
    从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
    如何查询Oracle的字符集
    很多人都碰到过因为字符集不同而使数据导入失败的情况。这涉及三方面的字符集,一是Oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在做数据导入的时候,需要这三个字符集都一致才能正确导入。
    1、查询Oracle Server端的字符集
    有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:
    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查出它对应的字符集:
    SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;  ZHS16GBK
    如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
    cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
    然后用上述SQL也可以得到它对应的字符集。
    3、查询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端相同的字符集。
    修改Oracle的字符集
    上文说过,oracle的字符集有互相的包容关系。
    如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
    一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
    修改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
    修改dmp文件字符集:
    上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
    具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:
    SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; 0354
    然后将dmp文件的2、3字节修改为0354即可。
    如果dmp文件很大,用ue无法打开,就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。我在Windows下测试通过。但要求Oracle数据库一定要安装JVM选项。
分享到:
评论

相关推荐

    Oracle+10g应用指导与案例精讲

    第10章 数据库管理,包括导出数据库模式的DDL脚本,管理Oracle数据库实例的方法、数据恢复与Flashback以及更改数据库字符集等具体方法。第11章 数据库的安全管理。包括加密Oracle子程序,存储应用程序用户名和口令,...

    oracle数据库应用与开发.docx

    ### Oracle数据库应用与开发知识点概览 #### 一、Oracle入门 ...通过以上知识点的学习和实践,可以全面掌握Oracle数据库的基础知识和高级技术,为后续的数据库管理和应用程序开发打下坚实的基础。

    Oracle 10g应用指导

    第10章 数据库管理,包括导出数据库模式的DDL脚本,管理Oracle数据库实例的方法、数据恢复与Flashback以及更改数据库字符集等具体方法。第11章 数据库的安全管理。包括加密Oracle子程序,存储应用程序用户名和口令,...

    oracle教程很实用

    Oracle是一个全球知名的数据库管理系统,其教程对于IT专业人士来说具有非常重要的实用价值。...通过这些内容的学习,读者可以全面掌握Oracle数据库的使用和管理知识,提升在数据库领域的专业技能。

    超详细ORACLE培训带实例带书签目录

    ### 超详细ORACLE培训知识点总结 #### 引言 本培训材料旨在全面介绍Oracle数据库的相关知识...通过系统地学习这些章节,读者可以建立起对Oracle数据库系统的全面认识,并能够灵活运用所学知识解决实际工作中的问题。

    oracle安装说明文档

    - 推荐使用缺省字符集,这样可以避免因为字符集不匹配导致的问题。 ##### 步骤十:确认安装选项 - 在这一步,安装向导会列出所有已选择的安装选项,供用户最后确认。如果一切无误,点击“安装”按钮开始安装过程。 ...

    Oracle常用傻瓜问题1000问

    ### Oracle常用傻瓜问题解析 ...通过以上的解答,我们对Oracle数据库的一些常见问题有了较为全面的认识,这对于初学者来说非常有用。同时,对于有一定经验的用户来说,也可以作为日常管理和维护数据库时的参考。

    超级详细Oracle教程 java

    ### Oracle数据库教程精要知识点梳理 #### 一、引言 ...通过以上内容,读者可以对Oracle数据库有一个全面的认识,并掌握从基础操作到高级功能的各种技巧。无论是初学者还是有一定经验的开发者,都能从中受益。

    oracle实例详解

    通过以上内容的学习,相信读者能够对Oracle数据库有一个较为全面的认识,并具备一定的实战能力。Oracle作为一款功能强大且灵活多变的数据库产品,其学习曲线虽然较陡峭,但掌握后将极大提升个人的职业竞争力。

    Oracle 11g PL/SQL 从入门到精通(视屏讲解)第一章

    Oracle 11g是Oracle公司推出的数据库管理系统的一个版本,它提供了强大的数据...随着课程的深入,你会接触到更高级的主题,如索引、触发器、存储过程、包、并发控制等,从而全面提高在Oracle数据库环境中的编程能力。

    Oracle9.0入门

    在Oracle 9.0中,可以使用DBCA(Database Configuration Assistant)来创建新数据库,设定数据库的字符集、表空间、数据文件、控制文件等关键参数。数据库的管理则包括启动、关闭数据库、备份与恢复、性能监控等。...

    oracle10实用培训教程

    根据提供的标题“Oracle10实用培训教程”及描述来看,这份文档主要针对的是Oracle数据库10g版本的实用技能培训。由于具体内容部分并没有提供实质性的学习资料或知识点介绍,因此我们将基于这一主题进行深入探讨,...

    oracle基础教程(超详细)

    ` —— 查看NLS参数的当前设置情况,如语言、字符集等。 #### 二、Oracle表的管理 **1. 创建表** - **基本语法:** - `CREATE TABLE 表名 (字段1 类型, 字段2 类型);` - 示例:`CREATE TABLE employee (id ...

    mysql数据库介绍及常用SQLl语句(整理).pdf

    修改数据库字符集:ALTER DATABASE db_name CHARACTER SET charset_name; -表操作命令: 选择数据库:USE db_name; 创建表:CREATE TABLE table_name (column1 datatype(length), column2 datatype(length), ...); ...

    oracle经典sql案例

    这些知识点全面地覆盖了Oracle SQL的基础查询、条件过滤、模糊匹配、数据更新、空值处理以及结果排序等内容,对于Oracle数据库的初学者来说是一套非常实用的学习资料。通过这些案例题和答案,学习者可以对SQL语句有...

    foxbase数据库软件

    FoxBase是一款早期的关系型数据库管理系统,它在个人计算机领域中有着重要的地位,特别是在数据库学习...通过深入研究和实践,你可以对关系型数据库有一个全面的认识,并为将来进一步学习更高级的数据库系统做好准备。

    sshe项目部署

    - 数据库字符集设置为UTF8。 - 使用命令`mysqld --skip-grant-tables`启动MySQL服务,此时root用户密码为空。 - 创建UTF8字符集的数据库。 - **使用其他数据库**: - **Oracle**: - 更新`pom.xml`中的Oracle...

    神奇的perl两本perl入门教材合集

    3. **数据库交互**:讲解如何使用DBI模块进行数据库操作,连接MySQL、Oracle等数据库。 4. **正则表达式进阶**:深入探讨正则表达式的高级用法,如回溯、捕获组、条件匹配等。 5. **Perl与Web开发**:如CGI编程,...

Global site tag (gtag.js) - Google Analytics