從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 in US7ASCII character 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 table BONUS 0 rows exported
EXP-00091: Exporting questionable statistics.
. . exporting table DEPT 4 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 oracle oinstall 20480 Jul 01 18:25 scott_test.dmp
[oracle@MISDB:~]$cat scott_test.dmp | od -x | head
0000000 0300 0145 5850 4f52 543a 5631 312e 3032
0000020 2e30 300a 4453 5953 0a52 5553 4552 530a
0000040 3430 3936 0a30 0a37 320a 300a 0001 0369
0000060 0367 0001 0000 0000 0000 0000 000e 0020
0000100 2020 2020 2020 2020 2020 2020 2020 2020
*
0000140 2020 2020 2020 2020 2057 6564 204a 756c
0000160 2031 2031 383a 3235 3a31 3520 3230 3135
0000200 7363 6f74 745f 7465 7374 2e64 6d70 0000
0000220 0000 0000 0000 0000 0000 0000 0000 0000
字符集資訊通常在DMP檔案頭的第二和第三個位元組資訊進行表示。注意:這個順序是在Big-Endian作業系統情況下。通常頭位資訊為:03xx(xx為任意位值)。
0x0001是可以在Oracle中找到對應的取值的。
SQL> select nls_charset_id(value) nls_charset_id, value
2 from v$nls_valid_values
3 where parameter = 'CHARACTERSET'
4 order 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
0000000 0303 6945 5850 4f52 543a 5631 312e 3032
0000020 2e30 300a 4453 5953 0a52 5553 4552 530a
0000040 3430 3936 0a30 0a37 320a 300a 0369 0369
0000060 0367 0001 0000 0000 0000 0000 0012 0020
0000100 2020 2020 2020 2020 2020 2020 2020 2020
*
0000140 2020 2020 2020 2020 2057 6564 204a 756c
0000160 2031 2031 383a 3239 3a34 3320 3230 3135
0000200 7363 6f74 745f 7465 7374 5f53 6574 2e64
0000220 6d70 0000 0000 0000 0000 0000 0000 0000
對應位數:0x0369對應AL32UTF8。下面為一些常見字符集的16進位制編碼。
The values for the most commonly used character sets are below:
Name ID
----------------------
US7ASCII 0x0001
WE8DEC 0x0002
WE8ISO8859P1 0x001f
EE8ISO8859P2 0x0020
SE8ISO8859P3 0x0021
NE8ISO8850P4 0x0022
CL8ISO8859P5 0x0023
AR8ISO8859P6 0x0024
EL8ISO8859P7 0x0025
IW8ISO8859P8 0x0026
WE8ISO8859P9 0x0027
WE8ISO8859P15 0x002e
TH8TISASCII 0x0029
US8PC437 0x0004
WE8ROMAN8 0x0005
WE8PC850 0x000a
EE8PC852 0x0096
RU8PC855 0X009B
TR8PC857 0x009C
WE8PC858 0x001c
WE8PC860 0x00A0
IS8PC861 0x00A1
N8PC865 0x00BE
RU8PC866 0x0098
EE8MSWIN1250 0x00aa
CL8MSWIN1251 0x00ab
WE8MSWIN1252 0x00b2
EL8MSWIN1253 0x00ae
TR8MSWIN1254 0x00b1
IW8MSWIN1255 0x00af
AR8MSWIN1256 0x0230
BLT8MSWIN1257 0x00b3
ZHT16MSWIN950 0x0363
ZHS16GBK 0x0354
ZHT16HKSCS 0x0364
JA16EUC 0x033e
JA16SJIS 0x0340
ZHT16BIG5 0x0361
AL24UTFFSS 0x0366
UTF8 0x0367
AL32UTF8 0x0369
說明:在使用NLS_LANG顯示指定字符集合之後,DMP檔案中就按照這個編碼方式進行組織檔案。
下面我們看一下在Little-Endian下的情況是如何的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1719846/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從Export DMP檔案看匯出字符集(下)Export
- 查詢dmp檔案(exp方式匯出) 字符集
- 修改exp 的 匯出dmp檔案的字符集
- 檢視較小dmp檔案,匯出時客戶端的字符集客戶端
- 雙位元組中文字符集匯出的DMP檔案匯入UTF8字符集
- oracle匯出dmp檔案的2種方法Oracle
- oracle匯入dmp檔案Oracle
- Export/Import匯入匯出時的字符集問題ExportImport
- plsql Oracle匯入dmp檔案SQLOracle
- 如何確定一個dmp檔案是exp匯出的還是expdp匯出的?
- 檢視dmp檔案是exp還是expdp匯出來的
- oracle匯入dmp檔案win10怎麼操作_win10系統oracle如何匯入dmp檔案OracleWin10
- oracle匯入dmp檔案的2種方法Oracle
- 識別exp匯出檔案所用的字符集
- exp匯出檔案時 字符集設定問題
- 如何根據exp匯出檔案確定client端匯出時的字符集client
- 【ASK_ORACLE】一眼判斷出Oracle的dmp檔案是用expdp匯出還是exp匯出Oracle
- File list Export for Mac(檔案列表匯出工具)ExportMac
- File list Export for Mac檔案列表匯出工具ExportMac
- MySQL匯入匯出檔案檔案MySql
- 【exp/imp】將US7ASCII字符集的dmp檔案匯入到ZHS16GBK字符集的資料庫中ASCII資料庫
- dmp檔案的做成
- SAP UI5 表格資料如何匯出成 Excel 檔案(Table Export As Excel)UIExcelExport
- 從SQL Server匯出txt檔案匯入Oralce遇到毫秒問題SQLServer
- (十一)Electron 匯入匯出檔案
- mysql 匯入匯出 sql檔案MySql
- MySQL匯入匯出平面檔案MySql
- OracleDatabase——資料庫表空間dmp匯出與匯入OracleDatabase資料庫
- oracle匯出到4G時提示終止寫入DMP檔案Oracle
- 從Gitlab中匯出issue到Excel檔案中GitlabExcel
- java匯出Excel檔案JavaExcel
- java匯出CSV檔案Java
- Oracle 匯出txt檔案Oracle
- js 匯出檔案流JS
- Oracle如何使用spool匯出utf8字符集的文字檔案Oracle
- 華表Cell檔案匯入匯出
- 用DEF檔案從DLL中匯出C++類 (轉)C++
- PHP 匯出 CSV 格式檔案PHP