本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger 的Oracle技术博客 本文链接地址: 如何解决Oracle DUL恢复clob时中文乱码问题? 闲来无聊,研究了一下Oracle DUL 恢复clob的情况,对于中文存储。这一点DUL赶ODU差距一大截。用起来
本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger 的Oracle技术博客
本文链接地址: 如何解决Oracle DUL恢复clob时中文乱码问题?
闲来无聊,研究了一下Oracle DUL 恢复clob的情况,对于中文存储。这一点DUL赶ODU差距一大截。用起来也很不顺手。
不过这当是无聊玩玩了,下面来说准备测试环境,本文仅供参考,不过各种Oracle数据恢复可以联系我!
准备测试表
[ora10g@killdb ~]$ sqlplus roger/roger ? SQL*Plus: Release 10.2.0.5.0 - Production on Sun Sep 14 03:58:10 2014 ? Copyright (c) 1982, 2010, Oracle. All Rights Reserved. ? ? Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options ? www.killdb.com>select * from test_clob; ? ID NAME ---------- ------------------------------------------- 1 我爱中国 2 我帅爆了 3 killdb.com ? www.killdb.com>desc test_clob Name Null? Type ---------------------------------------- -------- --------------------------- ID NUMBER NAME CLOB ? www.killdb.com> ? DUL> desc roger.test_clob; Table ROGER.TEST_CLOB obj#= 58448, dataobj#= 58448, ts#= 6, file#= 5, block#=835 tab#= 0, segcols= 2, clucols= 0 Column information: icol# 01 segcol# 01 ID len 22 type 2 NUMBER(0,-127) icol# 02 segcol# 02 NAME len 4000 type 112 CLOB cs 852(ZHS16GBK) LOB Segment: dataobj#= 58449, ts#= 6, file#= 5, block#=843 chunk=1 LOB Index: dataobj#= 58450, ts#= 6, file#= 5, block#=851 DUL>
将该block的数据dump,我们来看下数据实际上在block内是怎么存放的,如下:
tab 0, row 0, @0x1ee4 tl: 51 fb: --H-FL-- lb: 0x1 cc: 2 col 0: [ 2] c1 02 col 1: [44] 00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 26 a3 cd 00 18 09 00 00 00 00 00 00 08 00 00 00 00 00 01 62 11 72 31 4e 2d 56 fd tab 0, row 1, @0x1eab tl: 57 fb: --H-FL-- lb: 0x1 cc: 2 col 0: [ 2] c1 03 col 1: [50] 00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 26 a3 ce 00 1e 09 00 00 00 00 00 00 0e 00 00 00 00 00 01 00 62 00 11 00 5e 00 05 00 72 00 06 00 4e tab 0, row 2, @0x1e58 tl: 83 fb: --H-FL-- lb: 0x1 cc: 2 col 0: [ 2] c1 04 col 1: [76] 00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 26 a3 cf 00 38 09 00 00 00 00 00 00 28 00 00 00 00 00 01 00 00 00 6b 00 00 00 69 00 00 00 6c 00 00 00 6c 00 00 00 64 00 00 00 62 00 00 00 2e 00 00 00 63 00 00 00 6f 00 00 00 6d end_of_block_dump
这里我们以第一行的数据为例,我们知道,我第一行的数据其实只要4个汉字,为什么dump的col 1这么长呢?
前面的84个byte其实的lob header的信息,后面的8个bytes才是实际的lob data。可以看到这不是我们以往
说知道的16进制,而是unicode编码。如果你去对照unicode的中文编码表,这8个byte正好表示我们的4个汉字。
首先我们来测试dul,正常情况下,你会发现dul抽取的信息直接sqlldr加载之后,中文都是乱码。
####不经过转码的情况
--unload table数据 DUL> unload table roger.test_clob; . unloading (index organized) table LOB01400353 DUL: Warning: Recreating file "LOB01400353.ctl" 0 rows unloaded Preparing lob metadata from lob index Reading LOB01400353.dat 0 entries loaded and sorted 0 entries . unloading table TEST_CLOB DUL: Warning: Recreating file "ROGER_TEST_CLOB.ctl" 3 rows unloaded DUL> ? --创建相同表结构的测试表 www.killdb.com>create table test_clob_1 as select * from test_clob where 1=0; ? Table created. ? www.killdb.com> ? --修改ctl文件 修改ROGER_TEST_CLOB.ctl中的表名称,将内容修改为如下: load data CHARACTERSET ZHS16GBK infile 'ROGER_TEST_CLOB.dat' insert into table "ROGER"."TEST_CLOB_1" fields terminated by whitespace ( "ID" CHAR(1) enclosed by X'7C' ,"NAME" LOBFILE(LF58449) TERMINATED BY EOF NULLIF LF58449 = 'NONE', LF58449 FILLER CHAR(20) enclosed by X'7C' ) 说明:其实就是替换了一下表名称. ? --将数据加载到test_clob_1 [ora10g@killdb dul]$ sqlldr roger/roger control=ROGER_TEST_CLOB.ctl ? SQL*Loader: Release 10.2.0.5.0 - Production on Sun Sep 14 04:11:03 2014 ? Copyright (c) 1982, 2007, Oracle. All rights reserved. ? Commit point reached - logical record count 3 [ora10g@killdb dul]$ ? --验证test_clob_1 的数据 www.killdb.com>show user USER is "ROGER" www.killdb.com>select * from test_clob_1; ? ID NAME ---------- --------------------------------------------------------- 1 br1N-V 2 b^rN 3 ? www.killdb.com>
我们可以看到,几乎全是乱码。
开始我将unload产生的lob文件用UE打开,以及对比发现是以unicode的方式存在的,因此我们需要转码才行。
#### 经过转码的测试
使用Linux自带的iconv工具进行转码,该工具非常强大,支持多种编码,如下:
[ora10g@killdb dul]$ iconv -l|grep GB CN-GB// CSGB2312// CSISO58GB1988// EBCDIC-CP-GB// GB// GB2312// GB13000// GB18030// GBK// GB_1988-80// GB_198880// ISO646-GB// [ora10g@killdb dul]$ iconv -l|grep UCS 10646-1:1993/UCS4/ CSUCS4// ISO-10646/UCS2/ ISO-10646/UCS4/ UCS-2// UCS-2BE// UCS-2LE// UCS-4// UCS-4BE// UCS-4LE// UCS2// UCS4// ? [ora10g@killdb dul]$ mv LF0002.lob LF0002.lob.old [ora10g@killdb dul]$ iconv -f UCS-2BE -t gb2312 LF0002.lob.old > LF0002.lob
加载数据之前,先将表truncate清空:
www.killdb.com>truncate table test_clob_1; ? Table truncated. ? ++++加载数据 [ora10g@killdb dul]$ sqlldr roger/roger control=ROGER_TEST_CLOB.ctl ? SQL*Loader: Release 10.2.0.5.0 - Production on Sun Sep 14 04:27:43 2014 ? Copyright (c) 1982, 2007, Oracle. All rights reserved. ? Commit point reached - logical record count 3 [ora10g@killdb dul]$ ? ++++ 验证test_clob_1数据 ? www.killdb.com>select * from test_clob_1; ? ID NAME ---------- -------------------------------------------------------- 1 br1N-V 2 我帅爆了 3 ? www.killdb.com>
我们可以看到,经过处理的第2条数据正常的显示了。
可见,结合iconv工具,Oracle DUL可以完美的支持clob的中文恢复。
No related posts.



Golang(Go编程语言)是一种基于C语言的编程语言,被广泛用于Web开发、网络编程、操作系统等领域。然而,在编写Golang程序时经常会遇到一个常见的问题,就是“undeclaredname”(未声明名称)错误。下面将介绍如何解决这个问题。了解错误信息在编译和运行Golang程序时,如果遇到了未声明名称错误,会在控制台输出相应的错误信

Java中的ClassNotFoundException是一种常见的编译错误。当我们尝试使用Java虚拟机(JVM)加载某个类时,如果JVM找不到该类,就会抛出ClassNotFoundException。这个错误可能出现在程序运行时,也可能出现在编译时。在本文中,我们将讨论什么是ClassNotFoundException,它为什么会发生以及如何解决它。C

Go语言是一门越来越受欢迎的编程语言,它的简洁、高效、易于编写的特点已经被越来越多的开发者所认可。而在Go语言开发中,遇到编译错误是不可避免的。其中一个常见的错误就是“undefined:json.Marshal”。这个错误通常发生在你使用了Go标准库的“encoding/json”包时,编译器提示找不到“json.Marshal”的定义。这个问题的根本原

随着Java的广泛应用,Java程序在连接数据库时经常会出现JDBC错误。JDBC(JavaDatabaseConnectivity)是Java中用于连接数据库的编程接口,因此,JDBC错误是在Java程序与数据库交互时遇到的一种错误。下面将介绍一些最常见的JDBC错误及如何解决和避免它们。ClassNotFoundException这是最常见的JDBC

Go语言作为一门快速发展的编程语言,被广泛应用于各种项目和领域。然而,在使用golang编写程序时,你有可能会遇到一些报错,其中一个常见的报错是“undefinedvariableorfunction”。那么,这个错误是什么意思?它是如何产生的?又该如何解决呢?本文将会对这些问题进行探讨。首先,我们需要了解一些基本概念。在golang中,变量和函数是两

在golang中,函数在定义时需要明确返回值类型和返回值,但有时候会出现“missingreturn…”的错误,表示函数缺少返回语句。本文将介绍如何解决这个问题。确认函数签名如果在定义函数时声明了返回值类型,但没有返回具体的值,就会触发这个错误。因此,你可以先检查函数签名,确认声明了返回值类型。举个例子:funcadd(a,bint)int{

近年来,Golang一直受到越来越多开发者的青睐。但是,即使是最有经验的开发人员也会遇到一些挫折,比如一些报错。其中,一种常见的报错是:“invaliduseof,operator”。在这篇文章中,我将为大家介绍这个报错的原因,以及解决方法。首先,我们需要了解什么是","操作符。在Golang中,","操作符通常被用来在数组、参数列表或结构体中分隔不

在Vue应用中遇到“SyntaxError:Unexpectedtoken”怎么解决?Vue是前端开发中广泛使用的一个JavaScript框架,它可以让我们更轻松地管理页面的状态、渲染和交互。但是在编写Vue应用时,有时会遇到“SyntaxError:Unexpectedtoken”报错,这个错误提示意味着代码中存在语法错误,JavaScript引擎


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。