久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【Oracle字符集】識(shí)別及轉(zhuǎn)換導(dǎo)出文件的字符集

 數(shù)據(jù)和云 2020-07-01

 編輯手記:很多人在進(jìn)行數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出操作的時(shí)候會(huì)遇到字符集的問題,,今日揀選了 《循序漸進(jìn)Oracle》一書中的相關(guān)章節(jié),,希望對(duì)初學(xué)Oracle的朋友有所幫助。

在傳統(tǒng)的EXP導(dǎo)出文件中,,記錄著導(dǎo)出使用的字符集id,,通過查看導(dǎo)出文件頭的第2、3個(gè)字節(jié),我們可以找到十六進(jìn)制表示的字符集ID,,在Windows上,,可以使用UltraEdit等工具打開dmp文件,查看其導(dǎo)出字符集,,如圖所示:



在UNIX環(huán)境上,,可以通過以下命令來查看(以下范例來自Solaris平臺(tái)):

cat expdat.dmp | od -x | head  


需要注意的是,在不同平臺(tái),,以上命令的輸出可能有所不同,,比如在Linux平臺(tái):

[oracle@jumper oracle]$ cat a.dmp |od -x |head -2

0000000 0303 4554 5058524f3a54 3156 2e30 3230

0000020 302e0a31 4544 4759454c520a41544c42

這是由于Solaris和Linux的字節(jié)序是不同的,Solaris是Big-Endians,,Linux是Little-Endians,,所以Linux上的輸出通過交換可以得到:

0303 5445 58504f52 ….

字符集和Solaris上是一致的,所以也可以通過od的參數(shù)設(shè)置顯示格式:

[oracle@jumper oracle]$ cat a.dmp|od -t x1|head -2

0000000 03 03 54 45 58 504f52 543a56 31 30 2e 30 32

0000020 2e 30 310a44 45 59 474c450a52 54 41 424c

Oracle提供標(biāo)準(zhǔn)函數(shù),,對(duì)字符集名稱及ID進(jìn)行轉(zhuǎn)換:

SQL> selectnls_charset_id('ZHS16GBK') from dual;

NLS_CHARSET_ID('ZHS16GBK')

--------

852

SQL> select nls_charset_name(852) from dual;

NLS_CHAR

--------

ZHS16GBK

十進(jìn)制轉(zhuǎn)換十六進(jìn)制,,即可獲得字符集的編碼:

SQL> select to_char('852','xxxx') from dual;

TO_CH

-----

  354

對(duì)應(yīng)前兩張圖 第2、3字節(jié),,就知道該導(dǎo)出文件字符集為ZHS16GBk,。查詢數(shù)據(jù)庫(kù)中有效的字符集可以使用以下腳本:

col nls_charset_id for 9999

col nls_charset_name for a30

col hex_id for a20

select nls_charset_id(value) nls_charset_id,

       value nls_charset_name,to_char(nls_charset_id(value), 'xxxx') hex_id

  from v$nls_valid_values where parameter = 'CHARACTERSET'

 order by nls_charset_id(value);

輸出樣例如下:


而對(duì)于Oracle 10g的expdp導(dǎo)出文件,,一切則要簡(jiǎn)單得多,,在expdp的導(dǎo)出文件開始部分,Oracle以XML格式記錄了數(shù)據(jù)的字符集信息,,以下是一個(gè)單表導(dǎo)出文件的頭信息,。

在文件開始部分就記錄了數(shù)據(jù)庫(kù)的字符集、國(guó)家字符集及時(shí)區(qū)等信息,,在表字段的屬性部分也記錄了字符集ID:



對(duì)于傳統(tǒng)的DMP導(dǎo)出文件,,在很多時(shí)候,當(dāng)進(jìn)行導(dǎo)入操作時(shí),,已經(jīng)離開了源數(shù)據(jù)庫(kù),這時(shí)如果目標(biāo)數(shù)據(jù)庫(kù)的字符集和導(dǎo)出文件不一致,,多半就需要進(jìn)行特殊處理進(jìn)行轉(zhuǎn)換,。最常見的轉(zhuǎn)換發(fā)生在從US7ASCII到ZHS16GBK之間。

由于很多數(shù)據(jù)庫(kù)最初以US7ASCII字符集存儲(chǔ)中文,,單純通過導(dǎo)出導(dǎo)入是無法完成字符集轉(zhuǎn)換的,。對(duì)于這種情況,可以通過設(shè)置導(dǎo)出字符集為US7ASCII,,原樣導(dǎo)出數(shù)據(jù),;導(dǎo)出后修改導(dǎo)出文件的第二、三字符,修改0001為0354,,這樣就可以將US7ASCII字符集的數(shù)據(jù)正確導(dǎo)入到ZHS16GBK的數(shù)據(jù)庫(kù)中,。

如圖所示是一個(gè)測(cè)試?yán)樱覀兛梢酝ㄟ^UltraEdit等工具的二進(jìn)制編輯模式修改導(dǎo)出文件:


修改完成之后,,可以導(dǎo)入修改后的DMP文件:

E:\nls2>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

E:\nls2>imp eygle/eygle file=Sus7ascii-Cus7ascii-exp817.dmp fromuser=eygle touser=eygle tables=test

Export file created by EXPORT:V08.01.07via conventional path

import done in ZHS16GBK character set and AL16UTF16 NCHAR character set

export server uses UTF8 NCHAR character set (possible ncharset conversion)

. . importing table      "TEST"          2 rows imported

Import terminated successfully without warnings.

通過這種方式,,最終中文可以被正常導(dǎo)入ZSH16GBK的數(shù)據(jù)庫(kù):


另外一種可以嘗試的方法是使用create database命令。如果導(dǎo)出文件使用的字符集是US7ASCII,,目標(biāo)數(shù)據(jù)庫(kù)的字符集是ZHS16GBK,,就可以使用create database的方法來修改,具體操作如下:



然后可以導(dǎo)入數(shù)據(jù):

E:\nls2>set nls_lang=AMERICAN_AMERICA.US7ASCII

E:\nls2>imp eygle/eygle file=Sus7ascii-Cus7ascii.dmp fromuser=eygle touser=eygle

Export file created by EXPORT:V09.02.00via conventional path

import done in US7ASCII character set and AL16UTF16 NCHAR character set

import server uses ZHS16GBK character set (possible charset conversion)

. . importing table           "TEST"          2 rows imported

Import terminated successfully without warnings.

查詢導(dǎo)入數(shù)據(jù):

E:\nls2>sqlplus eygle/eygle

SQL> select * from test;

NAME

----------

測(cè)試

test

當(dāng)發(fā)出“create database character set us7ascii,;”命令時(shí),,數(shù)據(jù)庫(kù)v$nls_parameters中的字符集設(shè)置隨之更改,該參數(shù)影響導(dǎo)入進(jìn)程,,更改后可以正確導(dǎo)入數(shù)據(jù),,重起數(shù)據(jù)庫(kù)后,該設(shè)置恢復(fù),。

提示:v$nls_paraemters來源于x$nls_parameters,,該動(dòng)態(tài)性能視圖影響導(dǎo)入操作;而nls_database_parameters來源于props$數(shù)據(jù)表,,影響數(shù)據(jù)存儲(chǔ),。以上的方法只應(yīng)該在不得已的情況下使用,其本質(zhì)是欺騙數(shù)據(jù)庫(kù),,強(qiáng)制導(dǎo)入數(shù)據(jù),,但是可能會(huì)損失元數(shù)據(jù)。

如何加入"云和恩墨大講堂"微信群

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多