Oracle Database字符集(1)--案例分析

Oracle Database字符集(1)--案例分析

案例分析:

一次数据库导出(exp)案例分析

1)数据字符集

12:40:37 [email protected] prod>show parameter nls

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_language                         string      AMERICAN
nls_territory                        string      AMERICA

12:40:49 [email protected] prod>select userenv(‘language‘) from dual;

USERENV(‘LANGUAGE‘)
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

12:41:15 [email protected] prod>select to_char(nls_charset_id(‘ZHS16GBK‘), ‘xxxx‘) from dual;

TO_CH
-----
  354

2、导出table(EXP)

[[email protected] exp]$ exp scott/tiger file=emp.dmp indexes=n log=emp.log tables=emp

Export: Release 11.2.0.1.0 - Production on Tue Aug 12 12:43:18 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export done in US7ASCII character set and AL16UTF16 NCHAR character set

server uses ZHS16GBK character set (possible charset conversion)

Note: indexes on tables will not be exported

About to export specified tables via Conventional Path ...

. . exporting table                            EMP         14 rows exported

EXP-00091: Exporting questionable statistics.

Export terminated successfully with warnings.

@导出错误

[[email protected] ~]$ oerr exp 00091

00091, 00000, "Exporting questionable statistics."
// *Cause:  Export was able export statistics, but the statistics may not be
//          usuable. The statistics are questionable because one or more of
//          the following happened during export: a row error occurred, client
//          character set or NCHARSET does not match with the server, a query
//          clause was specified on export, only certain partitions or
//          subpartitions were exported, or a fatal error occurred while
//          processing a table.
// *Action: To export non-questionable statistics, change the client character
//          set or NCHARSET to match the server, export with no query clause,
//          export complete tables. If desired, import parameters can be
//          supplied so that only non-questionable statistics will be imported,
//          and all questionable statistics will be recalculated.

3、查看Client字符集

[[email protected] ~]$ echo $LANG

en_US.UTF-8

4、查看导出文件字符集

[[email protected] exp]$ cat emp.dmp |od -x|head -1|awk ‘{print $2 $3}‘|cut -c 3-6

0345

5、通过ultraedit查看导出文件字符集

@从2、3字节来看,字符集16进制代码为‘0001’

13:36:27 [email protected] prod>select nls_charset_name(to_number(‘0001‘,‘xxxx‘)) from dual;

NLS_CHARSET_NAME(TO_NUMBER(‘0001‘,‘XXXX‘
----------------------------------------
US7ASCII

@‘0001’的字符集为‘US7ASCII‘,在导出时发生了转换

6、修改客户端字符集

[[email protected] ~]$ cat .bash_profile

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

[[email protected] ~]$ echo $NLS_LANG

AMERICAN_AMERICA.ZHS16GBK

[[email protected] ~]$ echo $LANG

en_US.UTF-8

7、重新导出table(EXP)

[[email protected] exp]$ exp scott/tiger file=emp.dmp log=emp.log indexes=n tables=emp

Export: Release 11.2.0.1.0 - Production on Tue Aug 12 13:31:51 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
Note: indexes on tables will not be exported
About to export specified tables via Conventional Path ...
. . exporting table                            EMP         14 rows exported
Export terminated successfully without warnings.
@导出成功 !

8、查看导出文件字符集

[[email protected] exp]$ cat emp.dmp |od -x|head -1|awk ‘{print $2 $3}‘|cut -c 3-6

0345

通过ultraedit查看导出文件字符集

@’0354‘字符集16进制代码,应该是’ZHS16GBK‘;

附加: 

                     Oracle Database字符集基本概念

一、什么是Oracle字符集

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

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。

它的格式如下: NLS_LANG = language_territory.charset

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

其中:

Language: 指定服务器消息的语言, 影响提示信息是中文还是英文

Territory: 指定服务器的日期和数字格式,

Charset:  指定字符集。

如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

二.字符集的相关知识:

2.1 字符集
    实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。
    Oracle的字符集命名遵循以下命名规则:
    <Language><bit size><encoding>
    即: <语言><比特位数><编码>
    比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集 
  
2.2 字符编码方案

2.2.1 单字节编码
    (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII
    (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家
             例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)

2.2.2 多字节编码
    (1)变长多字节编码
    某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,   例如日语、汉语、印地语等
    例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280
    (2)定长多字节编码
    每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集

2.2.3 unicode编码
    Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。
    UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集 
  
2.3 字符集超级
    当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。
    Oracle8i和oracle9i官方文档资料中备有子集-超级对照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。 
  
2.4 数据库字符集(oracle服务器端字符集)
    数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。

2.4.1字符集
    (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据
    (2)用来标示诸如表名、列名以及PL/SQL变量等
    (3)用来存储SQL和PL/SQL程序单元等

2.4.2国家字符集:
    (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据
    (2)国家字符集实质上是为oracle选择的附加字符集,主要作用是为了增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16

2.4.3查询字符集参数
    可以查询以下数据字典或视图查看字符集设置情况
    nls_database_parameters、props$、v$nls_parameters
    查询结果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符集

2.4.4修改数据库字符集
    按照上文所说,数据库字符集在创建后原则上不能更改。不过有2种方法可行。

1. 如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。

2. 通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。 
  
2.5 客户端字符集(NLS_LANG参数)

2.5.1客户端字符集含义
    客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。

2.5.2 NLS_LANG参数格式
    NLS_LANG=<language>_<territory>.<client character set> 
    Language: 显示oracle消息,校验,日期命名
    Territory:指定默认日期、数字、货币等格式
    Client character set:指定客户端将使用的字符集
    例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII 
    AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集

2.5.3客户端字符集设置方法
     1)UNIX环境
         $NLS_LANG=“simplified chinese”_china.zhs16gbk
         $export NLS_LANG
         编辑oracle用户的profile文件
    2)Windows环境
         编辑注册表
         Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME

2.5.4 NLS参数查询
    Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
NLS_DATABASE_PARAMETERS:显示数据库当前NLS参数取值,包括数据库字符集取值
NLS_SESSION_PARAMETERS:  显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
NLS_INSTANCE_PARAMETE: 显示由参数文件init<SID>.ora 定义的参数

V$NLS_PARAMETERS:显示数据库当前NLS参数取值

2.5.5修改NLS参数
    使用下列方法可以修改NLS参数
    (1)修改实例启动时使用的初始化参数文件
    (2)修改环境变量NLS_LANG
    (3)使用ALTER SESSION语句,在oracle会话中修改
    (4)使用某些SQL函数
    NLS作用优先级别:Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数

三.EXP/IMP  字符集

3.1 EXP/IMP
    Export 和 Import 是一对读写Oracle数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中,由于使用exp/imp进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。 
EXP
     ____________ _________________ _____________
     |imp导入文件|<-|环境变量NLS_LANG|<-|数据库字符集|
      ------------   -----------------   -------------

IMP 
     ____________ _________________ _____________
     |imp导入文件|->|环境变量NLS_LANG|->|数据库字符集|
      ------------   -----------------   -------------

四个字符集是
   (1)源数据库字符集 
   (2)Export过程中用户会话字符集(通过NLS_LANG设定)
   (3)Import过程中用户会话字符集(通过NLS_LANG设定)
   (4)目标数据库字符集 
  
3.2导出的转换过程
    在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。

例:如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,这样转换后生成的Dmp文件已经发生了数据丢失。
因此如果想正确导出源数据库数据,则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集 
  
3.3导入的转换过程
    (1)确定导出数据库字符集环境
             通过读取导出文件头,可以获得导出文件的字符集设置
    (2)确定导入session的字符集,即导入Session使用的NLS_LANG环境变量
    (3)IMP读取导出文件
             读取导出文件字符集ID,和导入进程的NLS_LANG进行比较
    (4)如果导出文件字符集和导入Session字符集相同,那么在这一步骤内就不需要转换,    如果不同,就需要把数据转换为导入Session使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换

第一次:导入文件字符集与导入Session使用的字符集之间的转换,如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。
    第二次:导入Session字符集与数据库字符集之间的转换。



Oracle Database字符集(1)--案例分析

时间: 2024-10-28 20:32:41

Oracle Database字符集(1)--案例分析的相关文章

Oracle Database字符集(2)--基本概念

Oracle Database字符集(2)--基本概念 四. 查看数据库字符集 涉及三方面的字符集, 1. oracel server端的字符集; 2. oracle client端的字符集; 3. dmp文件的字符集. 在做数据导入的时候,需要这三个字符集都一致才能正确导入. 4.1 查询oracle server端的字符集 有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种: SQL> select userenv('language') from dua

Oracle Database 11g Express Edition修改字符集

为什么要修改字符集? 使用用户system,通过sqlplus程序连接到Oracle数据库,输入以下命令,查看字符集: SQL> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- AMERICAN_AMERICA.AL32UTF8 SQL> 我们可以看到查到的字符集为“AMERICAN_AMERICA.AL32UTF8”,而

【翻译自mos文章】在windows平台上怎么启用Oracle database 企业版的partition?

来源于: How to enable Partitioning in Oracle Database Enterprise Edition 11.2 on Windows (文档 ID 1188238.1) 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.1 and later Information in this document applies to any platform. 目标: 在Windows平台上怎么启用Or

修改Oracle数据库字符集

Oracle数据库字符集在创建后原则上不能更改.如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用 ALTER DATABASE CHARACTER SET UTF8 Oracle 字符集的查看和修改 一.什么是Oracle字符集 O

大型网站技术架构-核心原理与案例分析-阅读笔记4

在第四章案例章节中的淘宝网的架构演化案例分析小节中作者主要分析了淘宝架构的演化,以淘宝网的实例给我们分析介绍了淘宝网的业务发展历程及淘宝网的技术架构演化两个方面,在业务发展中作者写到淘宝的技术是随着淘宝业务一起发展起来的,业务是推动这技术发展的动力,淘宝如今的规模和当初有很明显的变化,在技术架构演化中介绍了架构技术的更新升级,该章节中主要介绍淘宝网的发展的历程,在随着时间的发展不断中网站的架构不断的引用着新的技术,由最初简单的c2c更改过来的网站,放弃了lamp架构转而使用java作为开发平台并

【翻译自mos文章】Oracle Database In-Memory Advisor

Oracle Database In-Memory 顾问 来源于: Oracle Database In-Memory Advisor (文档 ID 1965343.1) 适用于: Enterprise Manager for Oracle Database - Version 12.1.0.2.0 and later Oracle Database - Enterprise Edition - Version 12.1.0.2 and later Information in this doc

命令行界面下使用emca安装配置Oracle Database Control实战

作为命令行忠实用户,服务器端软件的运维都倾向于使用命令或 脚本完成,非常讨厌资源占用很大的GUI.Oracle数据库作为重要的服务器端软件,其安装运维自然也完全支持纯命令行方式,尽管同时提供了OUI这个GUI安装程序.至于纯命令行下静默安装Oracle11g,本人之前写过详细的博文,有需要的请参考之,博文地址http://blog.csdn.net/smstong/article/details/7352036.按照这篇博文安装的数据库完全可用.本文算是对前面这篇博文的一个补充,就是在数据库安装

利用虚拟索引(Virtual Index)优化数据库的案例分析

当我们在对生产库做优化的时候,主要就是对SQL语句的优化,包括语句的等价改写等,但其中很大一部分情况,又与索引有关.如果能合理利用合适的索引,可以使原本走全表扫描产生的逻辑读大大降低,提高数据库的性能.由于Oracle数据库中的索引本身就要占用磁盘空间,维护索引需要一定的开销,如何才能知道创建某个索引,会给数据带来性能的提升,而又不至于判断失误,创建了一个不恰当的索引,最后又不得不删除呢?这种情况下,我们可以利用Oralce提供的虚拟索引,即nosegment索引,它并不占用磁盘资源,只是在数据

[转]oracle awr报告生成和分析

转自:http://blog.csdn.net/cuker919/article/details/8767328 最近由于数据库cpu占用非常高,导致VCS常常自动切换,引起很多问题. 最近学习一下数据库awr分析数据库sql执行性能的分析报告.下面将初步讲解一下: 1.先登陆数据库,生成awr报告. linux:~ # su - oracle[email protected]:~> sqlplus '/as sysdba' SQL*Plus: Release 11.1.0.6.0 - Prod