ホームページ データベース mysql チュートリアル 如何解决Oracle DUL恢复clob时中文乱码问题?

如何解决Oracle DUL恢复clob时中文乱码问题?

Jun 07, 2016 pm 04:39 PM
clob oracle 中国語 文字化け どうやって 回復する 解決する

本站文章除注明转载外,均为本站原创: 转载自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.

如何解决Oracle DUL恢复clob时中文乱码问题? 本站文章除注明转载外,均为本站原创: 转载自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 [...]如何解决Oracle DUL恢复clob时中文乱码问题?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Oracleの表空間サイズを確認する方法 Oracleの表空間サイズを確認する方法 Apr 11, 2025 pm 08:15 PM

Oracle Tablespaceサイズを照会するには、次の手順に従ってください。クエリを実行して、TableSpace名を決定します。DBA_TABLESPACesからTableSpace_Nameを選択します。クエリを実行してテーブルスペースのサイズをクエリします:sum(bytes)をtotal_size、sum(bytes_free)asavail_space、sum(bytes) - sum(bytes_free)as sum(bytes_free)as dba_data_files from tablespace_

Oracleのインスタンス名を表示する方法 Oracleのインスタンス名を表示する方法 Apr 11, 2025 pm 08:18 PM

Oracleでインスタンス名を表示するには3つの方法があります。「sqlplus」と「v $ instanceからselect instance_name;」を使用します。」コマンドラインのコマンド。 「show instance_name;」を使用しますSQL*Plusのコマンド。オペレーティングシステムのタスクマネージャー、Oracle Enterprise Manager、またはオペレーティングシステムを介して、環境変数(LinuxのOracle_Sid)を確認してください。

Oracleビューを暗号化する方法 Oracleビューを暗号化する方法 Apr 11, 2025 pm 08:30 PM

Oracle View暗号化により、ビュー内のデータを暗号化でき、それにより機密情報のセキュリティが強化されます。手順には以下が含まれます。1)マスター暗号化キー(MEK)の作成。 2)暗号化されたビューを作成し、暗号化されるビューとMEKを指定します。 3)暗号化されたビューにアクセスすることをユーザーに許可します。暗号化されたビューがどのように機能するか:ユーザーが暗号化されたビューを求めてクエリをするとき、OracleはMEKを使用してデータを復号化し、認定ユーザーのみが読み取り可能なデータにアクセスできるようにします。

オラクルで時間を取得する方法 オラクルで時間を取得する方法 Apr 11, 2025 pm 08:09 PM

Oracleで時間を取得するには、次の方法があります。Current_Timestamp:現在のシステム時間を秒に正確に返します。 systimestamp:current_timestampよりも正確で、ナノ秒。 sysdate:時間部分を除く現在のシステム日付を返します。 to_char(sysdate、 'yyy-mm-dd hh24:mi:ss'):現在のシステムの日付と時刻を特定の形式に変換します。抽出:1年、月、時間など、時間の値から特定の部分を抽出します。

Oracleのインストールをアンインストールする方法は失敗しました Oracleのインストールをアンインストールする方法は失敗しました Apr 11, 2025 pm 08:24 PM

Oracleインストール障害のためのアンインストールメソッド:Oracleサービスを閉じ、Oracleプログラムファイルとレジストリキーを削除し、Oracle環境変数をアンインストールし、コンピューターを再起動します。アンインストールが失敗した場合、Oracle Universal Uninstallツールを使用して手動でアンインストールできます。

Oracleデータベースをインポートする方法 Oracleデータベースをインポートする方法 Apr 11, 2025 pm 08:06 PM

データインポート方法:1。SQLLOADERユーティリティを使用します。データファイルを準備し、制御ファイルを作成し、SQLLoaderを実行します。 2。IMP/EXPツールを使用します。データをエクスポートし、データをインポートします。ヒント:1。ビッグデータセットに推奨されるSQL*ローダー。 2。ターゲットテーブルが存在する必要があり、列定義が一致します。 3。インポート後、データの整合性を検証する必要があります。

Oracleのユーザーをセットアップする方法 Oracleのユーザーをセットアップする方法 Apr 11, 2025 pm 08:21 PM

Oracleでユーザーを作成するには、次の手順に従ってください。Createユーザーステートメントを使用して新しいユーザーを作成します。助成金ステートメントを使用して必要な権限を付与します。オプション:リソースステートメントを使用してクォータを設定します。デフォルトの役割や一時テーブルスペースなど、他のオプションを構成します。

無効な数のOracleを確認する方法 無効な数のOracleを確認する方法 Apr 11, 2025 pm 08:27 PM

Oracle無効な数値誤差は、データ型の不一致、数値オーバーフロー、データ変換エラー、またはデータの破損によって引き起こされる場合があります。トラブルシューティング手順には、データ型のチェック、デジタルオーバーフローの検出、データ変換のチェック、データの破損のチェック、nls_numeric_charactersパラメーターの構成、データ検証ロギングの有効化など、他の可能なソリューションの調査が含まれます。

See all articles