趙丹妮 遼寧錦州渤海大學信息科學與技術學院
ORACLE數據庫字符集問題及解決方法
趙丹妮 遼寧錦州渤海大學信息科學與技術學院
當將數據導入以及導出到數據庫里面的過程中,數據要與存儲的數據保持一致性,這是一個需要引起重視的問題,數據的一致性與設置字符集有著直接的聯系。本文主要是先圍繞著轉化字符集的機理展開,聯系具體的現實中所存在的具體問題,著重對ORACLE數據庫字符集存在的問題進行了分析,并且針對相關的問題提出了解決對策。
ORACLE 字符集 解決
作為現今數據庫平臺中最為流行的數據庫,在實際的工作運用中,Oracle經常由于字符集的因素從而造成數據庫里面的漢字信息在轉換的過程中產生亂碼,甚至于直接導致數據在遷移的過程中導致失敗等問題,這些問題對于用戶而言,是一個很大的困擾因素。所以針對這些數據字符集的問題,本文提出了相應的解決對策。
ORACLE數據庫在工廠的管理中起到了很大的作用,工廠數據的處理離不開數據庫。然而因為設置數據庫字符集的時候都不一樣,所以常常在具體的工作應用中常常會碰到當數據從數據庫服務器中導出的時候,顯示出的是亂碼,造成了很多的漢字很難辨認,這對于數據的讀寫都是一個很大的問題,另外因為工廠的需求,需要對數據進行遷移的時候,出現了遷移失敗等問題。這兩種數據庫問題是比較常見的。本文主要是討論了這兩種問題的解決對策。
為了滿足多種語言文字的需求,Oracle數據庫因此實現了字符集的設置。字符集的存在之處除了服務器端之外,還可以在客戶端中存在,同時客戶端中的字符集一定實現注冊。如果想要將Oracl數據庫中的相關漢字信息成功顯示在客戶端,那么就一定要保持客戶端的字符集和服務器端字符集是完全一致的;此外如果字符集是不相同的時候,那么在數據遷移,完成字符集轉換的過程中,就很容易出現重要數據的缺失,最終造成了數據庫在導入,導出數據的時候出現錯誤,最終失敗。
數據遷移的過程中,會經常用到Oracle的Import/emport工具,該工具可以實現數據的轉化以及數據的遷移,該工具可以跨平臺,因此數據遷移的過程中,應用十分廣泛。數據導出/導入的時候常常會用到下面的字符集:①源數據庫字符集;②目標字符集;③導入/導出過程中用戶會話字符集。
為了能夠適應多種文字語言的顯示問題,ORACLE數據庫中實現了字符集設定。客戶端以及服務器端都需要注冊字符集,當服務器端和客戶端的字符集是保持一致的時候,ORACLE數據庫才可以確保客戶端中的數據是完全正常顯示的。倘若字符集不是一樣的時候,那么在進行數據庫的操作過程中很可能出現數據顯示亂碼的現象。當字符集不一致,數據庫的遷移中字符集的轉換,數據容易出現丟失的情況,而且數據的導入導出也會出現問題。
4.1 查詢ORACLE服務端的字符集
查詢的對象ORACLE服務端中的字符集,可以選擇很多種方式,通常選擇直觀的方法有以下幾種:

顯示的結果為:NEWZLAND_NEWZLANDZHS15GBK
4.2 查詢dmp文件中字符集
當運用exp工具的時候就會導出dmp文件,dmp文件中會將字符集的相關信息表現出來,對dmp文件進行分析,第2個或者第3個字節處顯示的是字符集。當dmp文件是在幾十M以下的時候,能夠選擇16進制的UltraEdit查看這個dmp文件,對第2、第3字節中的信息進行分析,比如0336,該字節中的信息可以通過sql語句進行查詢,sql語句如下:

得出的顯示結果是ZHS18GBK。
然而大多數時候,dmp文件一般都是比較大的,有的甚至在2G以上,倘若依然是選擇上面的方法進行字符信息的查詢以及打開的話,顯然是不太適用的,有時會出現打不開文件的尷尬局面,有時即使打開了也是十分緩慢,這個時候查詢的方式可以是:cat exps. dmp |ods -x|head -1|awks ‘{prints $2 $3}’|cut -c 3-6,同時也可以根據sql語句查詢字符集。
對于ORACLE數據庫而言,許多的字符集彼此間是相互包容的聯系,例如US7ASCII和ZHSI6CBK,前者是為后者的子集,從前者到后者的這個字符集轉化的過程中,解釋數據的過程不會出現數據缺失的情況。同時ORACLE數據庫,轉換字符集操作有時是不可逆的,例如將子集向超集轉換的過程是可以實現的,但是反過來四不可以的。
5.1 客戶端字符集和服務器指定字符集不一致,但和加載數據字符集一致
一般情況下在創建數據的時候字符集通就確定了,當用戶的數據是存儲下來以后,數據就無法進行修改了,由于數據庫中的數據方式是字符集的形式,當變為其他的字符集后,之前的數據就無法正常顯示了。所以根據所查看到的服務器端中的字符集,設置客戶端。其中有2種配置的方法:
①當Oracle客戶端軟件安裝的時候指定。②根據對客戶端的操作系統中的注冊表進行修改,處于WINDOWS平臺下,能夠將注冊表打開,修改注冊表為:HKEY_LOCAL MACHINE ORACLEHOME中NLS_LANG值,從而實現統一服務器字符集于客戶端。
5.2 客戶端字符集和服務器指定字符集相一致,但是和加載數據字符集不同
當升級Oracle版本或者是進行系統安裝的時候,這種問題就會出現,另外如果當選擇的字符集和服務器端是不一致的,數據備份中仍然是選擇的根據之前的字符集卸出。在這種情況下,無論客戶端字符集與服務器端的是不是一致的,漢字都是不可能顯示出來的。通常要解決這種問題采取的方法總結如下。
5.2.1 將Oracle安裝在服務器端
當安裝的時候需要保證數據庫中的字符集和之前所卸出的字符集是一致的。這種情況下通常要用在空庫以及字符集是一致的情況下。
5.2.2 對服務器端進行強行地修改
當用imp命令對數據進行加載之前,需要先修改已有的Oracle數據庫中的字符集,確保加載的數據字符集和服務器中的的字符集是完全一致的。該字符集轉化方式比較簡單,然而實用性不是很大,轉化的場合是當新的字符集超過了原來的字符集的時候采用。解決方式如下:

選擇二進制的工具進行編輯,例如uedi 32。將dmp文件打開,從而得到第2、3字節的信息,比如0012,先將0012向10進制轉換,接著字符集獲得時選擇NLS_CHARSET__NAMES函數,sql語句如下:

接著將dmp文件里面的字符集進行修改為ZHSl5GBK,這個時候就用NLS—CHARSEl ID將這個字符集的編號進行獲取,sql語句如下:

將第2、3字節中的0002變為0364,從而就實現了該dmp文件的字符集轉化,這是個US7ASCII轉化為ZHSl6GBK的過程,接著將dmp文件導入到ZHSl6GBK字符集的數據庫就行了。
結語:深入了解Oracle轉化字符集相關原理,能夠給人們的實際工作減少很多不必要的麻煩,可以盡量防止數據的損失以及數據顯示中出現亂碼的局面,本文根據目前數據庫字符集所存在的問題從而提出了對應的解決對策。
[1]Stefano Andreozzi,Anirikh Chakrabarti,Keng Cher Soh,Anthony Burgard,Tae Hoon Yang,Stephen Van Dien,Ljubisa Miskovic,Vassily Hatzimanikatis. Identification of metabolic engineering targets for the enhancement of 1,4-butanediol production in recombinant E. coli using largescale kinetic models[J]. Metabolic Engineering,2016
[2]Mingyue Jiang,Tsong Yueh Chen,Fei-Ching Kuo,Dave Towey,Zuohua Ding. A Metamorphic Testing Approach for Supporting Program Repair Without the Need for a Test Oracle[J]. The Journal of Systems & Software,2015
[3]Katherine Brunson,Xin Zhao,Nu He,Xiangming Dai,Antonia Rodrigues,Dongya Yang. New insights into the origins of oracle bone divination: Ancient DNA from Late Neolithic Chinese bovines[J]. Journal of Archaeological Science,2016
[4]鄭曉江,孫雪華.ORACLE數據庫字符集問題及其解決方法[C]//上海市電機工程學會、上海市電工技術學會2001年學術年會.2015
