Oracle字符集轉換

2021-07-27 15:00:06 字數 4067 閱讀 2051

作為乙個oracle資料庫的使用者,對於export和import兩個命令絕對不會感到陌生,因為這

二者正是我們經常用於資料備份和恢復的工具。但在使用這兩個命令過程中所發生的oracle字

符集問題,常給一些oracle使用者帶來不必要的麻煩和不必要的資料損失。本文將就export和

import過程中oracle字符集的轉換規律及使用這兩個命令的注意事項做一總結。

字符集轉換的原因   

export、import過程如上圖所示,從這個示意圖中可以看到有四處關係到字符集,而這四

處字符集的不一致恰恰是導致oracle進行字符集轉換的原因。

* 源資料庫字符集;

* export過程中使用者會話字符集;

* import過程中使用者會話字符集;

* 目標資料庫字符集。

在export和import過程中,如果存在影響字符集轉換的四因素不一致,則可能發生oracle

在export過程中,如果源資料庫字符集與export使用者會話字符集不一致,會發生字符集轉

換,並在匯出的二進位制格式dmp檔案的頭部幾個位元組中儲存export使用者會話字符集的id號。在

例1: 如果源資料庫使用zhs16gbk,而export使用者會話字符集使用us7ascii,由於

zhs16gbk是8位字符集,而us7ascii是7位字符集,這個轉換過程中,中文字元在us7ascii中不

能夠找到對等的字元,所以所有中文字元都會丟失而變成「?? 」形式,即這種轉換後生成的

例2: 如果源資料庫使用zhs16gbk,而export使用者會話字符集使用zhs16cgb231280,但由

於zhs16gbk字符集是zhs16cgb231280字符集的超集,這個過程中絕大部分字元都能夠正確轉換

,只有一些超出zhs16cgb231280字符集的字元變為「?? 」形式。如果源資料庫使用

zhs16cgb231280字符集,而export使用者會話使用zhs16gbk字符集,則轉換過程能夠完全轉換成

在import向目標資料庫轉換過程中,其字符集發生轉換的情況正好與export過程相反,這

在export匯出的dmp檔案中,含有export使用者會話字符集。在import過程中,首先發生的

是dmp檔案字符集(即export使用者會話字符集)向import使用者會話字符集的轉換。如果這個轉

換過程不能正確完成,import向目標資料庫的匯入過程也就不能完成。

進行字符集的正確轉換

通常情況下,我們在使用oracle的export和import過程中,並不希望發生字元的轉換,但

有時這種轉換卻是必要的。如我們在安裝oracle資料庫時,選擇zhs16cgb231280字符集,由於

這種字符集是一種中文小字符集,對於一些漢字不能夠正確表示,這需要通過使用zhs16gbk字

為了確保export、import過程中,oracle字符集不發生轉換或正確轉換,建議最好在進行

這個過程前,檢查一下源資料庫字符集與export使用者會話字符集是否一致,源資料庫字符集與

目標資料庫字符集是否一致,目標資料庫字元與import使用者會話字符集是否一致。如果能夠保

證這四個字符集是一致的,則在export、import過程中,oracle字符集就不用發生轉換。

可用以下辦法檢查資料庫字符集:

通過init***x.ora檔案進行檢視;

借助sql語句檢視: select name,value$ from sys.props$ where name=『

對於export、import使用者會話字符集,在windows系統中也可以通過登錄檔中的nls_lang

進行檢視或修改,對於unix系統則可通過設定使用者的環境變數nls_lang來檢視或修改。

特別要注意的是,oracle資料庫字符集通常是在建立時確定,一旦儲存使用者資料後就不要

再修改了,因為其資料都是使用該字符集進行儲存的,改換其他字符集之後,原有資料就不能

夠正確表示了。但如果確實想進行字符集改變,則可通過以下幾步來實現:

備份資料庫後刪除原資料(可物理備份,如使用export,請注意確保字符集不發生轉換或

使用internal使用者更新sys.props$表中的字符集:

update sys.props$ set name=『dest.charset』 where name=『nls_characterset』;

重啟資料庫;

恢復資料。

下面字符集之間的轉換是可行的:

字符集子集向字符集父集轉換是可行的,如zhs16cgb231280向zhs16gbk轉換;而字符集父

只包含英文本元資料的雙位元組字符集也可向單位元組字符集轉換,如zhs16gbk(english

編碼範圍相同的單位元組字符集之間通常可以進行相互轉換。

請注意,這裡所說的沒有資料損失,是指一種字符集a轉換成另一種字符集b之後,可以再

從字符集b正確轉換成字符集a或字符集b能夠正確表示字符集a中轉換過來的資料。

字符集對程式的影響

根據乙個字元需要多少位位元組來表示,可以把字符集分為單位元組字符集和多位元組字符集。

其中,單位元組字符集又分為7位字符集和8位字符集。單位元組7位編碼字符集有us7ascⅱ,單字

節8位編碼字符集有符合iso 8859-1標準規定的we8iso8859p1等。多位元組編碼又分為固定長度

(長度大於或等於2)編碼模式和不固定長度編碼模式。多位元組編碼字符集中的zhs16gbk、

zhs16cgb231280、ja16sjis等是採用兩個位元組表示乙個字元的字符集,又叫雙位元組字符集。

乙個英文本母是乙個字元,乙個中文漢字是幾個字元呢?我們知道,乙個中文漢字是雙字

節字元,但它有幾個字元與其資料庫字符集有關。如果資料庫字符集使用單位元組us7ascii,則

乙個中文漢字是二個字元;如果資料庫字符集使用雙位元組字符集zhs16gbk,則乙個中文漢字是

乙個字元。有關這一點可以使用oracle的函式substr得到證明。

使用us7ascⅱ字符集時:

select substr(『東北大學』,1,2) from dual;

語句執行結果返回『東』。

使用zhs16gbk字符集時:

select substr(『東北大學』,1,2) from dual;

語句執行結果返回『東北』。

選擇合適的資料庫字符集

選擇資料庫字符集時應考慮以下事項:

1.資料庫需要支援什麼語言

在為資料庫選擇字符集時,常會發現幾種字符集都適合你當前語言需求,如簡體中文就有

zhs16gbk和zhscgb231280等字符集可供選擇,應選擇哪種?在選擇字符集時,應考慮到資料庫

將來的系統需求。如果知道將來資料庫要擴充套件支援不同的語言,選擇乙個範圍較廣的字符集會

2.系統資源與應用之間的互作用性

選擇的資料庫字符集應保證作業系統與應用之間的無縫連線。如果選擇的字符集不是操作

系統有效的字符集,則系統就需要在這兩者之間做字元轉換。在這種字元轉換過程中,就有可

能發生一些字元丟失現象。從一種字符集a向另一種字符集b轉換過程中,a中的字元必須在b中

可以找到等價的字元,否則就會以「?」來代替。從這個意義上說,如果兩種字符集編碼範圍

字符集轉換過程中會影響系統效能,因此,應保證客戶端和伺服器端有相同的字符集以避

免字符集轉換,也可以提高一定的系統效能。

3.系統的效能要求

不同的資料庫字符集對於資料庫的效能是有一定影響的。為了得到最好的資料庫效能,選

擇的資料庫字符集應避免字元轉換,並且要選擇對於期望的語言有最高效的編碼效率。通常,

單位元組字符集比多位元組字符集有更優的效能表現,在空間需求方面也更小些。

4.其他一些限制

於一些字符集的限制。如oracle 8.1.5版本中,以下字符集是不能使用的: ja16eucfixed、

zhs16gbkfixed、ja16dbcsfixed、ko16dbcsfixed、zhs16dbcsfixed、ja16sjisfixed、

綜上所述,正確理解oracle字符集的轉換過程,可以使我們避免不必要的麻煩和資料損失

。合理利用oracle字符集的轉換過程,也可以幫助我們正確地從一種字符集轉換到另一種字元

集,以滿足我們各種不同的應用需求。

字符集之間轉換

字符集之間轉換 特蒐集了utf 8,unicode,gb2312他們3個之間的相互轉換.utf 8 3位元組乙個字元 unicode 2位元組乙個字元 gb2312 1位元組乙個字元 例子 你 字的utf 8編碼 e4 bd a0 11100100 10111101 10100000 你 的unic...

Java String 字符集轉換

1,byte str.getbytes string charsetname 將str按指定的字符集charsetname解碼為字元陣列.返回用指定的字符集charsetname解碼後的字元陣列。2,string byte bytes,string charsetname 構造乙個新的string....

php字符集轉換

1.iconv 介紹 iconv函式可以將一種已知的字符集檔案轉換成另一種已知的字符集檔案。例如 從gb2312轉換為utf 8。iconv函式在php5中內建,gb字符集預設開啟。2.iconv 錯誤 iconv在轉換字元 到gb2312時會出錯,解決方法是在需要轉成的編碼後加 ignore 也就...