版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Oracle數(shù)據(jù)庫字符集問題總結(jié) 在不同數(shù)據(jù)庫做數(shù)據(jù)遷移、同其它系統(tǒng)交換數(shù)據(jù)等,常常因為字符集不同而導(dǎo)致遷移失敗或數(shù)據(jù)庫內(nèi)數(shù)據(jù)變成亂碼?,F(xiàn)在我將oracle字符集相關(guān)的一些知識做個簡單總結(jié) 一、什么是oracle字符集 Oracle字符集是一個字節(jié)數(shù)據(jù)的解釋的符號集合,有大小之分,有相互的包容關(guān)系。ORACLE 支持國家語言的體系結(jié)構(gòu)允許你使用本地化語言來存儲,處理,檢索數(shù)據(jù)。它使數(shù)據(jù)庫工具,錯誤消息,排序次序,日期,時間,貨幣,數(shù)字,和日歷自動適應(yīng)本地化語言和平臺。 影響oracle數(shù)據(jù)庫字符集最重要的參數(shù)是NLS_LANG參數(shù)。它的格式如下: NLS_LANG = language_ter
2、ritory.charset它有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。其中: Language 指定服務(wù)器消息的語言,territory 指定服務(wù)器的日期和數(shù)字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK 從NLS_LANG的組成我們可以看出,真正影響數(shù)據(jù)庫字符集的其實是第三部分。所以兩個數(shù)據(jù)庫之間的字符集只要第三部分一樣就可以相互導(dǎo)入導(dǎo)出數(shù)據(jù),前面影響的只是提示信息是中文還是英文。 二、如何查詢Oracle的字符集 很多人都碰到過因為字符集不同而使數(shù)據(jù)導(dǎo)入失敗的情況。這涉及三方面的字符集,一是oracel ser
3、ver端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在做數(shù)據(jù)導(dǎo)入的時候,需要這三個字符集都一致才能正確導(dǎo)入。 1、查詢oracle server端的字符集 有很多種方法可以查出oracle server端的字符集,比較直觀的查詢方法是以下這種: SQLselect userenv(language) from dual;結(jié)果類似如下:AMERICAN _ AMERICA. ZHS16GBK 2、如何查詢dmp文件的字符集 用oracle的exp工具導(dǎo)出的dmp文件也包含了字符集信息,dmp文件的第2和第3個字節(jié)記錄了dmp文件的字符集。如果dmp文件不大,比如只
4、有幾M或幾十M,可以用UltraEdit打開(16進(jìn)制方式),看第2第3個字節(jié)的內(nèi)容,如0354,然后用以下SQL查出它對應(yīng)的字符集: SQL select nls_charset_name(to_number(0354,xxxx) from dual; ZHS16GBK如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在unix主機上): cat exp.dmp |od -x|head -1|awk print $2 $3|cut -c 3-6然后用上述SQL也可以得到它對應(yīng)的字符集。 3、查詢oracle client端的字符集
5、這個比較簡單。在windows平臺下,就是注冊表里面相應(yīng)OracleHome的NLS_LANG。還可以在dos窗口里面自己設(shè)置,比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK這樣就只影響這個窗口里面的環(huán)境變量。 在unix平臺下,就是環(huán)境變量NLS_LANG。 $echo $NLS_LANG AMERICAN_AMERICA.ZHS16GBK如果檢查的結(jié)果發(fā)現(xiàn)server端與client端字符集不一致,請統(tǒng)一修改為同server端相同的字符集。三、修改oracle的字符集 上文說過,oracle的字符集有互相的包容關(guān)系。如us7ascii就是zhs16gb
6、k的子集,從us7ascii到zhs16gbk不會有數(shù)據(jù)解釋上的問題,不會有數(shù)據(jù)丟失。在所有的字符集中utf8應(yīng)該是最大,因為它基于unicode,雙字節(jié)保存字符(也因此在存儲空間上占用更多)。 一旦數(shù)據(jù)庫創(chuàng)建后,數(shù)據(jù)庫的字符集理論上講是不能改變的。因此,在設(shè)計和安裝之初考慮使用哪一種字符集十分重要。根據(jù)Oracle的官方說明,字符集的轉(zhuǎn)換是從子集到超集受支持,反之不行。如果兩種字符集之間根本沒有子集和超集的關(guān)系,那么字符集的轉(zhuǎn)換是不受oracle支持的。對數(shù)據(jù)庫server而言,錯誤的修改字符集將會導(dǎo)致很多不可測的后果,可能會嚴(yán)重影響數(shù)據(jù)庫的正常運行,所以在修改之前一定要確認(rèn)兩種字符集是否存
7、在子集和超集的關(guān)系。一般來說,除非萬不得已,我們不建議修改oracle數(shù)據(jù)庫server端的字符集。特別說明,我們最常用的兩種字符集ZHS16GBK和ZHS16CGB231280之間不存在子集和超集關(guān)系,因此理論上講這兩種字符集之間的相互轉(zhuǎn)換不受支持。 1、修改server端字符集(不建議使用) 在oracle 8之前,可以用直接修改數(shù)據(jù)字典表props$來改變數(shù)據(jù)庫的字符集。但oracle8之后,至少有三張系統(tǒng)表記錄了數(shù)據(jù)庫字符集的信息,只改props$表并不完全,可能引起嚴(yán)重的后果。正確的修改方法如下: $sqlplus /nolog SQLconn / as sysdba;若此時數(shù)據(jù)庫服
8、務(wù)器已啟動,則先執(zhí)行SHUTDOWN IMMEDIATE命令關(guān)閉數(shù)據(jù)庫服務(wù)器,然后執(zhí)行以下命令: SQLSTARTUP MOUNT; SQLALTER SYSTEM ENABLE RESTRICTED SESSION; SQLALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQLALTER SYSTEM SET AQ_TM_PROCESSES=0; SQLALTER DATABASE OPEN; SQLALTER DATABASE CHARACTER SET ZHS16GBK; SQLALTER DATABASE national CHARACTER SET Z
9、HS16GBK; SQLSHUTDOWN IMMEDIATE; SQLSTARTUP2、修改dmp文件字符集 上文說過,dmp文件的第2第3字節(jié)記錄了字符集信息,因此直接修改dmp文件的第2第3字節(jié)的內(nèi)容就可以騙過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關(guān)系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因為改的只是dmp文件,所以影響不大。 具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節(jié)。比如想將dmp
10、文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對應(yīng)的16進(jìn)制代碼: SQL select to_char(nls_charset_id(ZHS16GBK), xxxx) from dual; 0354然后將dmp文件的2、3字節(jié)修改為0354即可。 如果dmp文件很大,用ue無法打開,就需要用程序的方法了。網(wǎng)上有人用java存儲過程寫了轉(zhuǎn)換的程序(用java存儲過程的好處是通用性教好,缺點是比較麻煩)。我在windows下測試通過。但要求oracle數(shù)據(jù)庫一定要安裝JVM選項。有興趣的朋友可以研究一下程序代碼. (t114) 全面認(rèn)識oracle字符集什么是Oracle字符集
11、Oracle字符集是一個字節(jié)數(shù)據(jù)解釋的符號集合,有大小之分,有相互的包容關(guān)系。Oracle支持國家語言的體系結(jié)構(gòu)允許你使用本地化語言來存儲,處理,檢索數(shù)據(jù)。它使數(shù)據(jù)庫工具,錯誤消息,排序次序,日期,時間,貨幣,數(shù)字和日歷自動適應(yīng)本地化語言和平臺。影響oracle數(shù)據(jù)庫字符集最重要的參數(shù)是NLS_LANG參數(shù)。它的格式如下:NLS_LANG = language_territory.charset它有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。其中:Language指定服務(wù)器消息的語言,territory指定服務(wù)器的日期和數(shù)字格式,charset指定字符集。如:AMERI
12、CAN _ AMERICA. ZHS16GBK。從NLS_LANG的組成我們可以看出,真正影響數(shù)據(jù)庫字符集的其實是第三部分。所以兩個數(shù)據(jù)庫之間的字符集只要第三部分一樣就可以相互導(dǎo)入導(dǎo)出數(shù)據(jù),前面影響的只是提示信息是中文還是英文。如何查詢Oracle的字符集很多人都碰到過因為字符集不同而使數(shù)據(jù)導(dǎo)入失敗的情況。這涉及三方面的字符集,一是Oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在做數(shù)據(jù)導(dǎo)入的時候,需要這三個字符集都一致才能正確導(dǎo)入。1、查詢Oracle Server端的字符集有很多種方法可以查出oracle server端的字符集,比較
13、直觀的查詢方法是以下這種:SQLselect userenv(language) from dual;結(jié)果類似如下:AMERICAN _ AMERICA. ZHS16GBK.2、如何查詢dmp文件的字符集用Oracle的exp工具導(dǎo)出的dmp文件也包含了字符集信息,dmp文件的第2和第3個字節(jié)記錄了dmp文件的字符集。如果dmp文件不大,比如只有幾M或幾十M,可以用UltraEdit打開(16進(jìn)制方式),看第2第3個字節(jié)的內(nèi)容,如0354,然后用以下SQL查出它對應(yīng)的字符集:SQL select nls_charset_name(to_number(0354,xxxx) from dual;
14、ZHS16GBK如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在unix主機上):cat exp.dmp |od -x|head -1|awk print $2 $3|cut -c 3-6然后用上述SQL也可以得到它對應(yīng)的字符集。3、查詢Oracle client端的字符集這個比較簡單。在Windows平臺下,就是注冊表里面相應(yīng)OracleHome的NLS_LANG.還可以在Dos窗口里面自己設(shè)置,比如:set nls_lang=AMERICAN_AMERICA.ZHS16GBK這樣就只影響這個窗口里面的環(huán)境變量。在Unix平臺下
15、,就是環(huán)境變量NLS_LANG.$echo $NLS_LANG AMERICAN_AMERICA.ZHS16GBK如果檢查的結(jié)果發(fā)現(xiàn)Server端與Client端字符集不一致,請統(tǒng)一修改為同Server端相同的字符集。修改Oracle的字符集上文說過,oracle的字符集有互相的包容關(guān)系。如us7ascii就是zhs16gbk的子集,從us7ascii到zhs16gbk不會有數(shù)據(jù)解釋上的問題,不會有數(shù)據(jù)丟失。在所有的字符集中utf8應(yīng)該是最大,因為它基于unicode,雙字節(jié)保存字符(也因此在存儲空間上占用更多)。一旦數(shù)據(jù)庫創(chuàng)建后,數(shù)據(jù)庫的字符集理論上講是不能改變的。因此,在設(shè)計和安裝之初考慮
16、使用哪一種字符集十分重要。根據(jù)Oracle的官方說明,字符集的轉(zhuǎn)換是從子集到超集受支持,反之不行。如果兩種字符集之間根本沒有子集和超集的關(guān)系,那么字符集的轉(zhuǎn)換是不受oracle支持的。對數(shù)據(jù)庫server而言,錯誤的修改字符集將會導(dǎo)致很多不可測的后果,可能會嚴(yán)重影響數(shù)據(jù)庫的正常運行,所以在修改之前一定要確認(rèn)兩種字符集是否存在子集和超集的關(guān)系。一般來說,除非萬不得已,我們不建議修改oracle數(shù)據(jù)庫server端的字符集。特別說明,我們最常用的兩種字符集ZHS16GBK和ZHS16CGB231280之間不存在子集和超集關(guān)系,因此理論上講這兩種字符集之間的相互轉(zhuǎn)換不受支持。修改Server端字符集
17、(不建議使用):在Oracle 8之前,可以用直接修改數(shù)據(jù)字典表props$來改變數(shù)據(jù)庫的字符集。但Oracle8之后,至少有三張系統(tǒng)表記錄了數(shù)據(jù)庫字符集的信息,只改props$表并不完全,可能引起嚴(yán)重的后果。正確的修改方法如下:$sqlplus /nolog SQLconn / as sysdba;若此時數(shù)據(jù)庫服務(wù)器已啟動,則先執(zhí)行SHUTDOWN IMMEDIATE命令關(guān)閉數(shù)據(jù)庫服務(wù)器,然后執(zhí)行以下命令:SQLSTARTUP MOUNT; SQLALTER SYSTEM ENABLE RESTRICTED SESSION; SQLALTER SYSTEM SET JOB_QUEUE_PRO
18、CESSES=0; SQLALTER SYSTEM SET AQ_TM_PROCESSES=0; SQLALTER DATABASE OPEN; SQLALTER DATABASE CHARACTER SET ZHS16GBK; SQLALTER DATABASE national CHARACTER SET ZHS16GBK; SQLSHUTDOWN IMMEDIATE; SQLSTARTUP修改dmp文件字符集:上文說過,dmp文件的第2第3字節(jié)記錄了字符集信息,因此直接修改dmp文件的第2第3字節(jié)的內(nèi)容就可以騙過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒
19、有子集和超集關(guān)系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因為改的只是dmp文件,所以影響不大。具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節(jié)。比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對應(yīng)的16進(jìn)制代碼:SQL select to_char(nls_charset_id(ZHS16GBK), xxxx) from dual; 0354然后將dmp文件的2、3字節(jié)修改為0354即可。如果dmp文件很大,用ue無
20、法打開,就需要用程序的方法了。網(wǎng)上有人用java存儲過程寫了轉(zhuǎn)換的程序(用java存儲過程的好處是通用性教好,缺點是比較麻煩)。我在Windows下測試通過。但要求Oracle數(shù)據(jù)庫一定要安裝JVM選項。一引言O(shè)RACLE數(shù)據(jù)庫字符集,即Oracle全球化支持(Globalization Support),或即國家語言支持(NLS)其作用是用本國語言和格式來存儲、處理和檢索數(shù)據(jù)。利用全球化支持,ORACLE為用戶提供自己熟悉的數(shù)據(jù)庫母語環(huán)境,諸如日期格式、數(shù)字格式和存儲序列等。Oracle可以支持多種語言及字符集,其中oracle8i支持48種語言、76個國家地域、229種字符集,而oracl
21、e9i則支持57種語言、88個國家地域、235種字符集。由于oracle字符集種類多,且在存儲、檢索、遷移oracle數(shù)據(jù)時多個環(huán)節(jié)與字符集的設(shè)置密切相關(guān),因此在實際的應(yīng)用中,數(shù)據(jù)庫開發(fā)和管理人員經(jīng)常會遇到有關(guān)oracle字符集方面的問題。本文通過以下幾個方面闡述,對oracle字符集做簡要分析二字符集基本知識2.1字符集實質(zhì)就是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數(shù)值編碼的集合。Oracle數(shù)據(jù)庫最早支持的編碼方案是US7ASCII。Oracle的字符集命名遵循以下命名規(guī)則:即: 比如: ZHS16GBK表示采用GBK編碼格式、16位(兩個字節(jié))簡體中文字符集2.2字符編碼
22、方案2.2.1 單字節(jié)編碼(1)單字節(jié)7位字符集,可以定義128個字符,最常用的字符集為US7ASCII(2)單字節(jié)8位字符集,可以定義256個字符,適合于歐洲大部分國家例如:WE8ISO8859P1(西歐、8位、ISO標(biāo)準(zhǔn)8859P1編碼)2.2.2 多字節(jié)編碼(1)變長多字節(jié)編碼某些字符用一個字節(jié)表示,其它字符用兩個或多個字符表示,變長多字節(jié)編碼常用于對亞洲語言的支持, 例如日語、漢語、印地語等例如:AL32UTF8(其中AL代表ALL,指適用于所有語言)、zhs16cgb231280(2)定長多字節(jié)編碼每一個字符都使用固定長度字節(jié)的編碼方案,目前oracle唯一支持的定長多字節(jié)編碼是AF
23、16UTF16,也是僅用于國家字符集2.2.3 unicode編碼Unicode是一個涵蓋了目前全世界使用的所有已知字符的單一編碼方案,也就是說Unicode為每一個字符提供唯一的編碼。UTF-16是unicode的16位編碼方式,是一種定長多字節(jié)編碼,用2個字節(jié)表示一個unicode字符,AF16UTF16是UTF-16編碼字符集。UTF-8是unicode的8位編碼方式,是一種變長多字節(jié)編碼,這種編碼可以用1、2、3個字節(jié)表示一個unicode字符,AL32UTF8,UTF8、UTFE是UTF-8編碼字符集2.3 字符集超級當(dāng)一種字符集(字符集A)的編碼數(shù)值包含所有另一種字符集(字符集B)
24、的編碼數(shù)值,并且兩種字符集相同編碼數(shù)值代表相同的字符時,則字符集A是字符集B的超級,或稱字符集B是字符集A的子集。Oracle8i和oracle9i官方文檔資料中備有子集-超級對照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle數(shù)據(jù)庫編碼格式,因此有許多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。2.4 數(shù)據(jù)庫字符集(oracle服務(wù)器端字符集)數(shù)據(jù)庫字符集在創(chuàng)建數(shù)據(jù)庫時指定,在創(chuàng)建后通常不能更改。
25、在創(chuàng)建數(shù)據(jù)庫時,可以指定字符集(CHARACTER SET)和國家字符集(NATIONAL CHARACTER SET)。2.4.1字符集(1)用來存儲CHAR, VARCHAR2, CLOB, LONG等類型數(shù)據(jù)(2)用來標(biāo)示諸如表名、列名以及PL/SQL變量等(3)用來存儲SQL和PL/SQL程序單元等2.4.2國家字符集:(1)用以存儲NCHAR, NVARCHAR2, NCLOB等類型數(shù)據(jù)(2)國家字符集實質(zhì)上是為oracle選擇的附加字符集,主要作用是為了增強oracle的字符處理能力,因為NCHAR數(shù)據(jù)類型可以提供對亞洲使用定長多字節(jié)編碼的支持,而數(shù)據(jù)庫字符集則不能。國家字符集在o
26、racle9i中進(jìn)行了重新定義,只能在unicode編碼中的AF16UTF16和UTF8中選擇,默認(rèn)值是AF16UTF162.4.3查詢字符集參數(shù)可以查詢以下數(shù)據(jù)字典或視圖查看字符集設(shè)置情況nls_database_parameters、props$、v$nls_parameters查詢結(jié)果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示國家字符集2.4.4修改數(shù)據(jù)庫字符集按照上文所說,數(shù)據(jù)庫字符集在創(chuàng)建后原則上不能更改。如果需要修改字符集,通常需要導(dǎo)出數(shù)據(jù)庫數(shù)據(jù),重建數(shù)據(jù)庫,再導(dǎo)入數(shù)據(jù)庫數(shù)據(jù)的方式來轉(zhuǎn)換,或通過ALTER DATABASE CHA
27、RACTER SET語句修改字符集,但創(chuàng)建數(shù)據(jù)庫后修改字符集是有限制的,只有新的字符集是當(dāng)前字符集的超集時才能修改數(shù)據(jù)庫字符集,例如UTF8是US7ASCII的超集,修改數(shù)據(jù)庫字符集可使用ALTER DATABASE CHARACTER SET UTF8。2.5 客戶端字符集(NLS_LANG參數(shù))2.5.1客戶端字符集含義客戶端字符集定義了客戶端字符數(shù)據(jù)的編碼方式,任何發(fā)自或發(fā)往客戶端的字符數(shù)據(jù)均使用客戶端定義的字符集編碼,客戶端可以看作是能與數(shù)據(jù)庫直接連接的各種應(yīng)用,例如sqlplus,exp/imp等。客戶端字符集是通過設(shè)置NLS_LANG參數(shù)來設(shè)定的。2.5.2 NLS_LANG參數(shù)格
28、式NLS_LANG=_. Language:顯示oracle消息,校驗,日期命名Territory:指定默認(rèn)日期、數(shù)字、貨幣等格式Client character set:指定客戶端將使用的字符集例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII AMERICAN是語言,AMERICA是地區(qū),US7ASCII是客戶端字符集2.5.3客戶端字符集設(shè)置方法1)UNIX環(huán)境$NLS_LANG=“simplified chinese”_china.zhs16gbk$export NLS_LANG編輯oracle用戶的profile文件2)Windows環(huán)境編輯注冊表Regedi
29、t.exe-HKEY_LOCAL_MACHINE-SOFTWARE-ORACLEHOME02.5.4 NLS參數(shù)查詢Oracle提供若干NLS參數(shù)定制數(shù)據(jù)庫和用戶機以適應(yīng)本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通過查詢以下數(shù)據(jù)字典或v$視圖查看。NLS_DATABASE_PARAMETERS-顯示數(shù)據(jù)庫當(dāng)前NLS參數(shù)取值,包括數(shù)據(jù)庫字符集取值NLS_SESSION_PARAMETERS-顯示由NLS_LANG 設(shè)置的參數(shù),或經(jīng)過alter session 改變后的參數(shù)值(不包括由NLS_LANG 設(shè)置的客戶端字符集)NLS_IN
30、STANCE_PARAMETE-顯示由參數(shù)文件init.ora 定義的參數(shù)V$NLS_PARAMETERS-顯示數(shù)據(jù)庫當(dāng)前NLS參數(shù)取值2.5.5修改NLS參數(shù)使用下列方法可以修改NLS參數(shù)(1)修改實例啟動時使用的初始化參數(shù)文件(2)修改環(huán)境變量NLS_LANG(3)使用ALTER SESSION語句,在oracle會話中修改(4)使用某些SQL函數(shù)NLS作用優(yōu)先級別:Sql functionalter session環(huán)境變量或注冊表參數(shù)文件數(shù)據(jù)庫默認(rèn)參數(shù)三導(dǎo)入/導(dǎo)出與字符集轉(zhuǎn)換3.1 EXP/IMPExport 和 Import 是一對讀寫Oracle數(shù)據(jù)的工具。Export 將 Orac
31、le 數(shù)據(jù)庫中的數(shù)據(jù)輸出到操作系統(tǒng)文件中, Import 把這些文件中的數(shù)據(jù)讀到Oracle 數(shù)據(jù)庫中,由于使用exp/imp進(jìn)行數(shù)據(jù)遷移時,數(shù)據(jù)從源數(shù)據(jù)庫到目標(biāo)數(shù)據(jù)庫的過程中有四個環(huán)節(jié)涉及到字符集,如果這四個環(huán)節(jié)的字符集不一致,將會發(fā)生字符集轉(zhuǎn)換。EXP_ _ _|imp導(dǎo)入文件|-|環(huán)境變量NLS_LANG|環(huán)境變量NLS_LANG|-|數(shù)據(jù)庫字符集|- - -四個字符集是(1)源數(shù)據(jù)庫字符集 (2)Export過程中用戶會話字符集(通過NLS_LANG設(shè)定)(3)Import過程中用戶會話字符集(通過NLS_LANG設(shè)定)(4)目標(biāo)數(shù)據(jù)庫字符集3.2導(dǎo)出的轉(zhuǎn)換過程在Export過程中,如
32、果源數(shù)據(jù)庫字符集與Export用戶會話字符集不一致,會發(fā)生字符集轉(zhuǎn)換,并在導(dǎo)出文件的頭部幾個字節(jié)中存儲Export用戶會話字符集的ID號。在這個轉(zhuǎn)換過程中可能發(fā)生數(shù)據(jù)的丟失。例:如果源數(shù)據(jù)庫使用ZHS16GBK,而Export用戶會話字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,這個轉(zhuǎn)換過程中,中文字符在US7ASCII中不能夠找到對等的字符,所以所有中文字符都會丟失而變成“? ”形式,這樣轉(zhuǎn)換后生成的Dmp文件已經(jīng)發(fā)生了數(shù)據(jù)丟失。因此如果想正確導(dǎo)出源數(shù)據(jù)庫數(shù)據(jù),則Export過程中用戶會話字符集應(yīng)等于源數(shù)據(jù)庫字符集或是源數(shù)據(jù)庫字符集的超集3.
33、3導(dǎo)入的轉(zhuǎn)換過程(1)確定導(dǎo)出數(shù)據(jù)庫字符集環(huán)境通過讀取導(dǎo)出文件頭,可以獲得導(dǎo)出文件的字符集設(shè)置(2)確定導(dǎo)入session的字符集,即導(dǎo)入Session使用的NLS_LANG環(huán)境變量(3)IMP讀取導(dǎo)出文件讀取導(dǎo)出文件字符集ID,和導(dǎo)入進(jìn)程的NLS_LANG進(jìn)行比較(4)如果導(dǎo)出文件字符集和導(dǎo)入Session字符集相同,那么在這一步驟內(nèi)就不需要轉(zhuǎn)換,如果不同,就需要把數(shù)據(jù)轉(zhuǎn)換為導(dǎo)入Session使用的字符集??梢钥闯?,導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫過程中發(fā)生兩次字符集轉(zhuǎn)換第一次:導(dǎo)入文件字符集與導(dǎo)入Session使用的字符集之間的轉(zhuǎn)換,如果這個轉(zhuǎn)換過程不能正確完成,Import向目標(biāo)數(shù)據(jù)庫的導(dǎo)入過程也就不能
34、完成。第二次:導(dǎo)入Session字符集與數(shù)據(jù)庫字符集之間的轉(zhuǎn)換。然而,oracle8i的這種轉(zhuǎn)換只能在單字節(jié)字符集之間進(jìn)行,oracle8i導(dǎo)入Session不支持多字節(jié)字符集之間的轉(zhuǎn)換,因此為了避免第一次轉(zhuǎn)換,導(dǎo)入Session使用的NLS_LANG與導(dǎo)出文件字符集相同,第二次轉(zhuǎn)換(通過SQL*Net)支持任何兩種字符集。以上情況在Oracle9i中略有不同四亂碼問題oracle在數(shù)據(jù)存儲、遷移過程中經(jīng)常發(fā)生字符亂碼問題,歸根到底是由于字符集使用不當(dāng)引起。下面以使用客戶端sqlplus向數(shù)據(jù)庫插入數(shù)據(jù)和導(dǎo)入/導(dǎo)出(EXP/IMP)過程為例,說明亂碼產(chǎn)生的原因。4.1使用客戶端sqlplus向
35、數(shù)據(jù)庫存儲數(shù)據(jù)這個過程存在3個字符集設(shè)置(1)客戶端應(yīng)用字符集(2)客戶端NLS_LANG參數(shù)設(shè)置(3)服務(wù)器端數(shù)據(jù)庫字符集(Character Set)設(shè)置客戶端應(yīng)用sqlplus中能夠顯示什么樣的字符取決于客戶端操作系統(tǒng)語言環(huán)境(客戶端應(yīng)用字符集),但在應(yīng)用中錄入這些字符后,這些字符能否在數(shù)據(jù)庫中正常存儲,還與另外兩個字符集設(shè)置緊密相關(guān),其中客戶端NLS_LANG參數(shù)主要用于字符數(shù)據(jù)傳輸過程中的轉(zhuǎn)換判斷。常見的亂碼大致有兩種情形:(1)漢字變成問號“?”;當(dāng)從字符集A 轉(zhuǎn)換成字符集B時,如果轉(zhuǎn)換字符之間不存在對應(yīng)關(guān)系,NLS_LANG使用替代字符“?”替代無法映射的字符(2)漢字變成未知字
36、符(雖然有些是漢字,但與原字符含義不同)轉(zhuǎn)換存在對應(yīng)關(guān)系,但字符集A 中的字符編碼與字符集B 中的字符編碼代表不同含義4.2發(fā)生亂碼原因 亂碼產(chǎn)生是由于幾個字符集之間轉(zhuǎn)換不匹配造成,分以下幾種情況:(注:字符集之間如果不存在子集、超集對應(yīng)關(guān)系時的情況不予考慮,因為這種情況下字符集之間轉(zhuǎn)換必產(chǎn)生亂碼) 1)服務(wù)器端數(shù)據(jù)庫字符集與客戶端應(yīng)用字符集相同,與客戶端NLS_LANG參數(shù)設(shè)置不同如果客戶端NLS_LANG字符集是其它兩種字符集的子集,轉(zhuǎn)換過程將出現(xiàn)亂碼。解決方法:將三種字符集設(shè)置成同一字符集,或NLS_LANG字符集是其它兩種字符集的超集2)服務(wù)器端數(shù)據(jù)庫字符集與客戶端NLS_LANG參數(shù)
37、設(shè)置相同,與客戶端應(yīng)用字符集不同如果客戶端應(yīng)用字符集是其它兩種字符集的超集時,轉(zhuǎn)換過程將出現(xiàn)亂碼,但對于單字節(jié)編碼存儲中文問題,可參看本文第5章節(jié)的分析3)客戶端應(yīng)用字符集、客戶端NLS_LANG參數(shù)設(shè)置、服務(wù)器端數(shù)據(jù)庫字符集互不相同此種情況較為復(fù)雜,但三種字符集之間只要有不能轉(zhuǎn)換的字符,則必產(chǎn)生亂碼4.3導(dǎo)入/導(dǎo)出過程出現(xiàn)亂碼原因這個過程存在4個字符集設(shè)置,在3.1章節(jié)中已分析(1)源數(shù)據(jù)庫字符集(2)EXP過程中NLS_LANG參數(shù) (3)IMP過程中NLS_LANG參數(shù)(4)目標(biāo)數(shù)據(jù)庫字符集出現(xiàn)亂碼原因1)當(dāng)源數(shù)據(jù)庫字符集不等于EXP過程中NLS_LANG參數(shù),且源數(shù)據(jù)庫字符集是EXP過程中NLS_LANG的子集,才能保證導(dǎo)出文件正確,其他情況則導(dǎo)出文件字符
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度電子商務(wù)平臺合作訂單合同4篇
- 專業(yè)安裝勞務(wù)協(xié)議規(guī)范文本2024版
- 《a臨時起搏器》課件
- 二零二五年度礦業(yè)權(quán)轉(zhuǎn)讓中的水資源利用合同3篇
- 2024版園林綠化工程設(shè)計與施工合同3篇
- 2025年度智慧能源場標(biāo)準(zhǔn)化改造項目合同協(xié)議書4篇
- 2024科研機構(gòu)與制藥公司之間的藥物研發(fā)合同
- 2024石子加工與新型建材研發(fā)生產(chǎn)合同3篇
- 2025年度廠房出租合同附帶租賃雙方權(quán)利義務(wù)界定4篇
- 2025年度茶樓消防安全管理責(zé)任合同4篇
- 2024年安徽省公務(wù)員錄用考試《行測》真題及答案解析
- 山西省太原市重點中學(xué)2025屆物理高一第一學(xué)期期末統(tǒng)考試題含解析
- 充電樁項目運營方案
- 2024年農(nóng)民職業(yè)農(nóng)業(yè)素質(zhì)技能考試題庫(附含答案)
- 高考對聯(lián)題(對聯(lián)知識、高考真題及答案、對應(yīng)練習(xí)題)
- 新版《鐵道概論》考試復(fù)習(xí)試題庫(含答案)
- 【律師承辦案件費用清單】(計時收費)模板
- 高中物理競賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- Unit1FestivalsandCelebrations詞匯清單高中英語人教版
- 2024年上海市中考語文試題卷(含答案)
- 幼兒園美術(shù)教育研究策略國內(nèi)外
評論
0/150
提交評論