gbk

          oracle字符集

          作為一個Oracle數(shù)據(jù)庫的用戶,對于Export和Import兩個命令絕對不會感到陌生,因為這二者正是我們經(jīng)常用于數(shù)據(jù)備份和恢復(fù)的工具。但在使用這兩個命令過程中所發(fā)生的Oracle字符集問題,常給一些Oracle使用者帶來不必要的麻煩和不必要的數(shù)據(jù)損失。本文將就Export和Import過程中Oracle字符集的轉(zhuǎn)換規(guī)律及使用這兩個命令的注意事項做一總結(jié)。  
               
               
             
            字符集轉(zhuǎn)換的原因  
            Export、Import過程如下圖所示,從這個示意圖中可以看到有四處關(guān)系到字符集,而這四處字符集的不一致恰恰是導(dǎo)致Oracle進(jìn)行字符集轉(zhuǎn)換的原因。    
             
            源數(shù)據(jù)庫字符集;    
            Export過程中用戶會話字符集;    
            Import過程中用戶會話字符集;    
            目標(biāo)數(shù)據(jù)庫字符集。    
            在Export和Import過程中,如果存在影響字符集轉(zhuǎn)換的四因素不一致,則可能發(fā)生Oracle字符集轉(zhuǎn)換,即:    
             
            在Export過程中,如果源數(shù)據(jù)庫字符集與Export用戶會話字符集不一致,會發(fā)生字符集轉(zhuǎn)換,并在導(dǎo)出的二進(jìn)制格式Dmp文件的頭部幾個字節(jié)中存儲Export用戶會話字符集的ID號。在這個轉(zhuǎn)換過程中可能發(fā)生數(shù)據(jù)的丟失。    
            例1:   如果源數(shù)據(jù)庫使用ZHS16GBK,而Export用戶會話字符集使用US7ASCII,由于ZHS16GBK是8位字符集,而US7ASCII是7位字符集,這個轉(zhuǎn)換過程中,中文字符在US7ASCII中不能夠找到對等的字符,所以所有中文字符都會丟失而變成“??   ”形式,即這種轉(zhuǎn)換后生成的Dmp文件已經(jīng)發(fā)生了數(shù)據(jù)丟失。    
            例2:   如果源數(shù)據(jù)庫使用ZHS16GBK,而Export用戶會話字符集使用ZHS16CGB231280,但由于ZHS16GBK字符集是ZHS16CGB231280字符集的超集,這個過程中絕大部分字符都能夠正確轉(zhuǎn)換,只有一些超出ZHS16CGB231280字符集的字符變?yōu)?#8220;??   ”形式。如果源數(shù)據(jù)庫使用ZHS16CGB231280字符集,而Export用戶會話使用ZHS16GBK字符集,則轉(zhuǎn)換過程能夠完全轉(zhuǎn)換成功。    
            在Import向目標(biāo)數(shù)據(jù)庫轉(zhuǎn)換過程中,其字符集發(fā)生轉(zhuǎn)換的情況正好與Export過程相反,這里不再詳述。    
            在Export導(dǎo)出的Dmp文件中,含有Export用戶會話字符集。在Import過程中,首先發(fā)生的是Dmp文件字符集(即Export用戶會話字符集)向Import用戶會話字符集的轉(zhuǎn)換。如果這個轉(zhuǎn)換過程不能正確完成,Import向目標(biāo)數(shù)據(jù)庫的導(dǎo)入過程也就不能完成。    
             
            進(jìn)行字符集的正確轉(zhuǎn)換  
            通常情況下,我們在使用Oracle的Export和Import過程中,并不希望發(fā)生字符的轉(zhuǎn)換,但有時這種轉(zhuǎn)換卻是必要的。如我們在安裝Oracle數(shù)據(jù)庫時,選擇ZHS16CGB231280字符集,由于這種字符集是一種中文小字符集,對于一些漢字不能夠正確表示,這需要通過使用ZHS16GBK字符集得到解決,此時就要進(jìn)行字符集的轉(zhuǎn)換。    
             
            為了確保Export、Import過程中,Oracle字符集不發(fā)生轉(zhuǎn)換或正確轉(zhuǎn)換,建議最好在進(jìn)行這個過程前,檢查一下源數(shù)據(jù)庫字符集與Export用戶會話字符集是否一致,源數(shù)據(jù)庫字符集與目標(biāo)數(shù)據(jù)庫字符集是否一致,目標(biāo)數(shù)據(jù)庫字符與Import用戶會話字符集是否一致。如果能夠保證這四個字符集是一致的,則在Export、Import過程中,Oracle字符集就不用發(fā)生轉(zhuǎn)換。    
             
            可用以下辦法檢查數(shù)據(jù)庫字符集:    
             
            通過InitXXXX.ora文件進(jìn)行查看;    
            借助SQL語句查看:   SELECT   NAME,VALUE$   FROM   SYS.PROPS$   WHERE   NAME=‘NLS_CHARACTERSET’。    
            對于Export、Import用戶會話字符集,在Windows系統(tǒng)中也可以通過注冊表中的NLS_LANG進(jìn)行查看或修改,對于Unix系統(tǒng)則可通過設(shè)置用戶的環(huán)境變量NLS_LANG來查看或修改。    
             
            特別要注意的是,Oracle數(shù)據(jù)庫字符集通常是在創(chuàng)建時確定,一旦存儲用戶數(shù)據(jù)后就不要再修改了,因為其數(shù)據(jù)都是使用該字符集進(jìn)行存儲的,改換其他字符集之后,原有數(shù)據(jù)就不能夠正確表示了。但如果確實想進(jìn)行字符集改變,則可通過以下幾步來實現(xiàn):    
             
            備份數(shù)據(jù)庫后刪除原數(shù)據(jù)(可物理備份,如使用Export,請注意確保字符集不發(fā)生轉(zhuǎn)換或數(shù)據(jù)無損失);    
            使用Internal用戶更新sys.props$表中的字符集:  
            Update   sys.props$   set   name=‘Dest.CharSet’   Where   name=‘NLS_CHARACTERSET’;   COMMIT;    
            重啟數(shù)據(jù)庫;    
            恢復(fù)數(shù)據(jù)。    
            下面字符集之間的轉(zhuǎn)換是可行的:    
             
            字符集子集向字符集父集轉(zhuǎn)換是可行的,如ZHS16CGB231280向ZHS16GBK轉(zhuǎn)換;而字符集父類向字符集子集進(jìn)行轉(zhuǎn)換時,會損失部分?jǐn)?shù)據(jù)。    
            只包含英文字符數(shù)據(jù)的雙字節(jié)字符集也可向單字節(jié)字符集轉(zhuǎn)換,如ZHS16GBK(English   Only)可以向US7ASCII正確轉(zhuǎn)換。    
            編碼范圍相同的單字節(jié)字符集之間通常可以進(jìn)行相互轉(zhuǎn)換。    
            請注意,這里所說的沒有數(shù)據(jù)損失,是指一種字符集A轉(zhuǎn)換成另一種字符集B之后,可以再從字符集B正確轉(zhuǎn)換成字符集A或字符集B能夠正確表示字符集A中轉(zhuǎn)換過來的數(shù)據(jù)。    
             
             
            字符集對程序的影響  
            根據(jù)一個字符需要多少位字節(jié)來表示,可以把字符集分為單字節(jié)字符集和多字節(jié)字符集。其中,單字節(jié)字符集又分為7位字符集和8位字符集。單字節(jié)7位編碼字符集有US7ASCⅡ,單字節(jié)8位編碼字符集有符合ISO   8859-1標(biāo)準(zhǔn)規(guī)定的WE8ISO8859P1等。多字節(jié)編碼又分為固定長度(長度大于或等于2)編碼模式和不固定長度編碼模式。多字節(jié)編碼字符集中的ZHS16GBK、ZHS16CGB231280、JA16SJIS等是采用兩個字節(jié)表示一個字符的字符集,又叫雙字節(jié)字符集。    
             
            一個英文字母是一個字符,一個中文漢字是幾個字符呢?我們知道,一個中文漢字是雙字節(jié)字符,但它有幾個字符與其數(shù)據(jù)庫字符集有關(guān)。如果數(shù)據(jù)庫字符集使用單字節(jié)US7ASCII,則一個中文漢字是二個字符;如果數(shù)據(jù)庫字符集使用雙字節(jié)字符集ZHS16GBK,則一個中文漢字是一個字符。有關(guān)這一點可以使用Oracle的函數(shù)Substr得到證明。    
            使用US7ASCⅡ字符集時:    
            Select   substr(‘東北大學(xué)’,1,2)   from   dual;    
            語句執(zhí)行結(jié)果返回‘東’。  
             
             
            使用ZHS16GBK字符集時:    
            Select   substr(‘東北大學(xué)’,1,2)   from   dual;    
            語句執(zhí)行結(jié)果返回‘東北’。    
             
            選擇合適的數(shù)據(jù)庫字符集  
            選擇數(shù)據(jù)庫字符集時應(yīng)考慮以下事項:    
             
             
            1.?dāng)?shù)據(jù)庫需要支持什么語言    
            在為數(shù)據(jù)庫選擇字符集時,常會發(fā)現(xiàn)幾種字符集都適合你當(dāng)前語言需求,如簡體中文就有ZHS16GBK和ZHSCGB231280等字符集可供選擇,應(yīng)選擇哪種?在選擇字符集時,應(yīng)考慮到數(shù)據(jù)庫將來的系統(tǒng)需求。如果知道將來數(shù)據(jù)庫要擴展支持不同的語言,選擇一個范圍較廣的字符集會是一個更好的主意。    
             
             
            2.系統(tǒng)資源與應(yīng)用之間的互作用性  
            選擇的數(shù)據(jù)庫字符集應(yīng)保證操作系統(tǒng)與應(yīng)用之間的無縫連接。如果選擇的字符集不是操作系統(tǒng)有效的字符集,則系統(tǒng)就需要在這兩者之間做字符轉(zhuǎn)換。在這種字符轉(zhuǎn)換過程中,就有可能發(fā)生一些字符丟失現(xiàn)象。從一種字符集A向另一種字符集B轉(zhuǎn)換過程中,A中的字符必須在B中可以找到等價的字符,否則就會以“?”來代替。從這個意義上說,如果兩種字符集編碼范圍是相同的,則可以相互轉(zhuǎn)換。    
             
            字符集轉(zhuǎn)換過程中會影響系統(tǒng)性能,因此,應(yīng)保證客戶端和服務(wù)器端有相同的字符集以避免字符集轉(zhuǎn)換,也可以提高一定的系統(tǒng)性能。    
             
             
            3.系統(tǒng)的性能要求  
            不同的數(shù)據(jù)庫字符集對于數(shù)據(jù)庫的性能是有一定影響的。為了得到最好的數(shù)據(jù)庫性能,選擇的數(shù)據(jù)庫字符集應(yīng)避免字符轉(zhuǎn)換,并且要選擇對于期望的語言有最高效的編碼效率。通常,單字節(jié)字符集比多字節(jié)字符集有更優(yōu)的性能表現(xiàn),在空間需求方面也更小些。    
             
             
            4.其他一些限制  
            在為數(shù)據(jù)庫選擇一個合適的字符集時,應(yīng)參考Oracle對應(yīng)版本的相關(guān)文檔,檢查Oracle對于一些字符集的限制。如Oracle   8.1.5版本中,以下字符集是不能使用的:   JA16EUCFIXED、ZHS16GBKFIXED、JA16DBCSFIXED、KO16DBCSFIXED、ZHS16DBCSFIXED、JA16SJISFIXED、ZHT32TRISFIXED。    
             
            綜上所述,正確理解Oracle字符集的轉(zhuǎn)換過程,可以使我們避免不必要的麻煩和數(shù)據(jù)損失。合理利用Oracle字符集的轉(zhuǎn)換過程,也可以幫助我們正確地從一種字符集轉(zhuǎn)換到另一種字符集,以滿足我們各種不同的應(yīng)用需求。

          posted on 2008-04-14 22:22 百科 閱讀(804) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 河南省| 临沂市| 大方县| 东乌珠穆沁旗| 和静县| 凤凰县| 逊克县| 青铜峡市| 铜山县| 宁陕县| 西安市| 井陉县| 新疆| 建始县| 洛隆县| 中卫市| 若尔盖县| 合江县| 许昌县| 哈尔滨市| 宁德市| 淮南市| 牙克石市| 盐山县| 都江堰市| 于都县| 藁城市| 连城县| 会泽县| 高碑店市| 琼结县| 余江县| 桂林市| 云林县| 丰都县| 赤城县| 成武县| 临桂县| 东源县| 西林县| 万州区|