oracle10gdmp字符集,从Export DMP文件看导出字符集(上)

从Export DMP文件看导出字符集

Oracle从10g开始,正式推出了新一代数据逻辑备份还原工具Data Pump(数据泵),以期替代“历史悠久”的Exp/Imp工具。经过近10年的发展,依然有不少用户,特别是开发人员,对这对工具有比较强的依赖性。很多开发环境中数据传输依然是使用Exp/Imp进行。

在使用Exp/Imp工具过程中,字符集、版本兼容一致是比较困扰用户的两个重点难点。字符集决定我们导出数据能否正确的导入到目标系统,是否从根本出现乱码故障。版本兼容问题涉及到原系统、目标系统数据库版本、导入客户端和导出客户端版本四个版本问题。Oracle官方MOS上曾经对这个问题用系列的矩阵来描述之前关系和兼容性,但是能记住的朋友实际寥寥。

笔者本篇主要介绍通过Export导出的Dmp文件检查字符集的方法,同时也看出一些字符集使用过程中常见的问题。

1、环境介绍

Endian是操作系统底层技术的一个重要方面。数据传输、设备通信都伴随着源与目标系统之间字符协议的认知。Endian问题所涉及的基础问题是:当通信发生的时候,信息单元(比特、字节、字和双字)以什么样的顺序进行传输。如果双方不统一或者不兼容,根本不可能实现数据的交换解码。

在Oracle领域中,比较常见Endian讨论是在可传输表空间技术上。可传输表空间是目前普遍认为比较快速的数据移植策略,基本上近似于文件直接传输。但是,可传输表空间不能实现跨Endian操作系统的传输操作。

我们在实际中,两种常见的Endian结构,即Big-Endian和Little-Endian。Big-Endian通常为Sparc, PowerPc, PARisc, RS/6000, SGI R4000 systems,经常接触的Unix系统一般为Big-Endian操作系统。Little-Endian系统读写顺序与Big-Endian相反,代表系统为Intel/AMD x86 and Alpha。

不同Endian环境下形成的DMP文件结构是有所不同的。Oracle在操作的时候,兼容两种Endian传输模式。这也就是我们为什么可以方便的在Unix和Linux之间交换传输数据的原因。

通过对DMP文件的直接读取,我们是可以分析看出DMP文件导出过程中使用的字符集配置的。下面通过一系列实验来进行测试:

2、Big-Endian下DMP分析实验

首先我们测试Big-Endian结构。我们选择Unix系统数据库环境。

[oracle@MISDB:~]$uname -a

AIX MISDB 1 6 00F7FCC94C00

我们首先不做任何环境变量设置,观察Export工作行为。

[oracle@MISDB:~]$exp \"/ as sysdba\" owner=scott file=scott_test.dmp

Export: Release 11.2.0.3.0 - Production on Wed Jul 1 18:25:15 2015

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

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

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

Export done inUS7ASCIIcharacter set and UTF8 NCHAR character set

server uses AL32UTF8 character set (possible charset conversion)

About to export specified users ...

. exporting pre-schema procedural objects and actions

. exporting foreign function library names for user SCOTT

. exporting PUBLIC type synonyms

. exporting private type synonyms

. exporting object type definitions for user SCOTT

About to export SCOTT's objects ...

. exporting database links

. exporting sequence numbers

. exporting cluster definitions

. about to export SCOTT's tables via Conventional Path ...

. . exporting tableBONUS0 rows exported

EXP-00091: Exporting questionable statistics.

. . exporting tableDEPT4 rows exported

EXP-00091: Exporting questionable statistics.

EXP-00091: Exporting questionable statistics.

(篇幅原因,有省略……)

. exporting statistics

Export terminated successfully with warnings.

注意标红的两个部分:其一是EXP-00091错误提示信息,之前笔者文章中已经对这个错误有过说明,主要是没有设置NLS_LANG环境变量。另一个是标记的US7ASCII字符集参数。

Oracle Export工具的特点是这样,如果在执行前没有设置NLS_LANG环境变量,就直接取Oracle早期默认字符集US7ASCII作为导出的对象。从数据库中原有的字符集(例如AL32UTF8)都要转化为US7ASCII进行保存。

这样是潜藏着一些问题的:如果没有设置NLS_LANG环境变量,数据导出被整理为US7ASCII格式。一旦数据库中保存的是WE8DEC类型的数据,也会被强制转化为US7ASCII,所有没有对应US7ASCII的字符就会自动被破坏成乱码。

下面,我们从dmp文件中检查字符集。

[oracle@MISDB:~]$ls -l | grep dmp

-rw-r--r--1 oracleoinstall20480 Jul 01 18:25 scott_test.dmp

[oracle@MISDB:~]$cat scott_test.dmp | od -x | head

00000000300 0145 5850 4f52 543a 5631 312e 3032

00000202e30 300a 4453 5953 0a52 5553 4552 530a

00000403430 3936 0a30 0a37 320a 300a 0001 0369

00000600367 0001 0000 0000 0000 0000 000e 0020

00001002020 2020 2020 2020 2020 2020 2020 2020

*

00001402020 2020 2020 2020 2057 6564 204a 756c

00001602031 2031 383a 3235 3a31 3520 3230 3135

00002007363 6f74 745f 7465 7374 2e64 6d70 0000

00002200000 0000 0000 0000 0000 0000 0000 0000

字符集信息通常在DMP文件头的第二和第三个字节信息进行表示。注意:这个顺序是在Big-Endian操作系统情况下。通常头位信息为:03xx(xx为任意位值)。

0x0001是可以在Oracle中找到对应的取值的。

SQL> select nls_charset_id(value) nls_charset_id,value

2fromv$nls_valid_values

3where parameter = 'CHARACTERSET'

4order by nls_charset_id(value);

NLS_CHARSET_ID VALUE

-------------- ----------------------------------------------------------------

1 US7ASCII

2 WE8DEC

(篇幅原因,有省略……)

1865 ZHT16BIG5FIXED

2000 AL16UTF16

247 rows selected

US7ASCII对应的为0x0001,说明导出的文件字符集为US7ASCII。下面我们设置一下NLS_LANG环境变量进行测试。

[oracle@MISDB:~]$export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

[oracle@MISDB:~]$exp \"/ as sysdba\" owner=scott file=scott_test_Set.dmp

Export: Release 11.2.0.3.0 - Production on Wed Jul 1 18:29:43 2015

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

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

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

Export done in AL32UTF8 character set and UTF8 NCHAR character set

About to export specified users ...

(篇幅原因,有省略……)

Export terminated successfully without warnings.

查看文件头信息。

[oracle@MISDB:~]$cat scott_test_Set.dmp | od -x | head

00000000303 6945 5850 4f52 543a 5631 312e 3032

00000202e30 300a 4453 5953 0a52 5553 4552 530a

00000403430 3936 0a30 0a37 320a 300a 0369 0369

00000600367 0001 0000 0000 0000 0000 0012 0020

00001002020 2020 2020 2020 2020 2020 2020 2020

*

00001402020 2020 2020 2020 2057 6564 204a 756c

00001602031 2031 383a 3239 3a34 3320 3230 3135

00002007363 6f74 745f 7465 7374 5f53 6574 2e64

00002206d70 0000 0000 0000 0000 0000 0000 0000

对应位数:0x0369对应AL32UTF8。下面为一些常见字符集的16进制编码。

The values for the most commonly used character sets are below:

NameID

----------------------

US7ASCII0x0001

WE8DEC0x0002

WE8ISO8859P10x001f

EE8ISO8859P20x0020

SE8ISO8859P30x0021

NE8ISO8850P40x0022

CL8ISO8859P50x0023

AR8ISO8859P60x0024

EL8ISO8859P70x0025

IW8ISO8859P80x0026

WE8ISO8859P90x0027

WE8ISO8859P150x002e

TH8TISASCII0x0029

US8PC4370x0004

WE8ROMAN80x0005

WE8PC8500x000a

EE8PC8520x0096

RU8PC8550X009B

TR8PC8570x009C

WE8PC8580x001c

WE8PC8600x00A0

IS8PC8610x00A1

N8PC8650x00BE

RU8PC8660x0098

EE8MSWIN12500x00aa

CL8MSWIN12510x00ab

WE8MSWIN12520x00b2

EL8MSWIN12530x00ae

TR8MSWIN12540x00b1

IW8MSWIN12550x00af

AR8MSWIN12560x0230

BLT8MSWIN12570x00b3

ZHT16MSWIN9500x0363

ZHS16GBK0x0354

ZHT16HKSCS 0x0364

JA16EUC0x033e

JA16SJIS0x0340

ZHT16BIG50x0361

AL24UTFFSS0x0366

UTF80x0367

AL32UTF80x0369

说明:在使用NLS_LANG显示指定字符集合之后,DMP文件中就按照这个编码方式进行组织文件。

下面我们看一下在Little-Endian下的情况是如何的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值