|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 4. 導入導出及轉換 導入導出是我們常用的一個數據遷移及轉化工具,因其導出文件具有平臺無關性,所以在跨平臺遷移中,最為常用。 在導出操作時,非常重要的是客戶端的字符集設置,也就是客戶端的NLS_LANG設置。 NLS_LANG參數由以下部分組成: NLS_LANG=<Language>_<Territory>.<Clients Characterset> NLS_LANG各部分含義如下: LANGUAGE指定: -Oracle消息使用的語言 -日期中月份和日顯示 TERRITORY指定 -貨幣和數字格式 -地區和計算星期及日期的習慣 CHARACTERSET: -控制客戶端應用程序使用的字符集 通常設置或者等于客戶端(如Windows)代碼頁 或者對于unicode應用設置為UTF8 在Windows上查看當前系統的代碼頁可以使用chcp命令: E:\>chcp 活動的代碼頁: 936 代碼頁936也就是中文字符集 GBK,在Microsoft的官方站點上,我們可以遭到關于936代碼頁的具體編碼規則,請參考以下鏈接: http://www.microsoft.com/globaldev/reference/dbcs/936.htm 我們看一個簡單的測試,來了解一下這幾個參數的作用: E:\>set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK E:\>sqlplus "/ as sysdba" SQL*Plus: Release 9.2.0.4.0 - Production on 星期六 11月 1 22:51:59 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 連接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options JServer Release 9.2.0.4.0 - Production SQL> select sysdate from dual; SYSDATE ---------- 01-11月-03 已選擇 1 行。 SQL> exit 從Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options JServer Release 9.2.0.4.0 - Production中斷開 E:\>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK E:\>sqlplus "/ as sysdba" SQL*Plus: Release 9.2.0.4.0 - Production on Sat Nov 1 22:52:24 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. Connected to: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options JServer Release 9.2.0.4.0 - Production SQL> select sysdate from dual; SYSDATE --------- 01-NOV-03 1 row selected. SQL> 查看客戶端NLS_LANG設置可以使用以下方法: Windows使用: echo %NLS_LANG% 如: E:\>echo %NLS_LANG% AMERICAN_AMERICA.ZHS16GBK Unix使用: env|grep NLS_LANG 如: /opt/oracle>env|grep NLS_LANG NLS_LANG=AMERICAN_CHINA.ZHS16GBK Windows客戶端設置,可以在注冊表中更改NLS_LANG,具體鍵值位于: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\ xx指存在多個ORACLE_HOME時系統編號。 導入和導出是客戶端產品,同SQL*PLUS和Oralce Forms一樣,因此,使用EXP/IMP工具將按照NLS_LANG定義的方式轉換字符集。 導出使用的字符集將會記錄在導出文件中,當文件導入時,將會檢查導出時使用的字符集設置,如果這個字符集不同于導入客戶端的NLS_LANG 設置,字符集將根據導入客戶端NLS_LANG設置進行轉換,如果必要,在數據插入數據庫之前會進行進一步轉換。 通常在導出時最好把客戶端字符集設置得和數據庫端相同,這樣可以避免在導出時發生不必要的數據轉換,導出文件將和數據庫具有相同的字符集。 即使將來會把導出文件導入到不同字符集的數據庫中,這樣做也可以把轉換延緩至導入時刻。 當進行數據導入時,主要存在以下兩種情況: 1.源數據庫和目標數據庫具有相同字符集設置 這時,只需要設置NLS_LANG等于數據庫字符集即可導入(前提是,導出使用的是和源數據庫相同字符集,即三者相同) 2.源數據庫和目標數據庫字符集不同 如果我們導出時候使用的NLS_LANG是和源數據庫相同的字符集,那么導入時就可以設置客戶端NLS_LANG等于導出時使用的字符集,這 樣轉換只發生在數據庫端,而且只發生一次。 例如: 如果進行從WE8MSWIN1252到UTF8的轉換 1)使用NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252導出數據庫。 這時創建的導出文件包含WE8MSWIN1252的數據 2)導入時使用NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 這時轉換僅發生在insert數據到UTF8的數據庫中。 以上假設的轉換只在目標數據庫字符集是源數據庫字符集的超集時才能轉換。如果不同,一般就需要進行一些特殊的處理。 我們簡單看一下導入的轉換過程(以Oracle8i為例): 1.確定導出數據庫字符集環境 通過讀取導出文件頭,可以獲得導出文件的字符集設置 2.確定導入session的字符集,即導入Session使用的NLS_LANG環境變量 3.IMP讀取導出文件 讀取導出文件字符集ID,和導入進程的NLS_LANG進行比較 4.如果導出文件字符集和導入Session字符集相同,那么在這一步驟內就不需要轉換 如果不同,就需要把數據轉換為導入Session使用的字符集。 然而這種轉換只能在單byte字符集之間進行。 我們看一個測試: E:\nls2>set NLS_LANG=AMERICAN_AMERICA.US7ASCII 設置導入session NLS_LANG為US7ASCII E:\nls2>e:\oracle\ora8i\bin\imp eygle/eygle file=Sus7ascii-Cus7ascii-exp817.dmp fromuser=eygle touser=eygle tables=test 這個導出文件是從US7ASCII數據庫導出,導出客戶端NLS_LANG也是US7ASCII Import: Release 8.1.7.1.1 - Production on Fri Nov 7 00:59:22 2003 (c) Copyright 2000 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.7.1.1 - Production With the Partitioning option JServer Release 8.1.7.1.1 - Production 這時導入,在DMP文件和NLS_LANG之間不需要進行字符集轉換。 Export file created by EXPORT:V08.01.07 via conventional path import done in US7ASCII character set and ZHS16GBK NCHAR character set import server uses ZHS16GBK character set (possible charset conversion) export server uses UTF8 NCHAR character set (possible ncharset conversion) . . importing table "TEST" 2 rows imported Import terminated successfully without warnings. 5.對于多Byte字符集的導入(如:UTF8) 需要設置導入Session字符集和導出字符集相同 否則就會遇到:IMP-16 "Required character set conversion (type %lu to %lu) not supported" 錯誤。 : E:\nls2>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 導入Session字符集設置為ZHS16GBK 導入US7ASCII的導出文件 E:\nls2>e:\oracle\ora8i\bin\imp eygle/eygle file=Sus7ascii-Cus7ascii-exp817.dmp fromuser=eygle touser=eygle Import: Release 8.1.7.1.1 - Production on Fri Nov 7 00:38:55 2003 (c) Copyright 2000 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.7.1.1 - Production With the Partitioning option JServer Release 8.1.7.1.1 - Production IMP-00016: required character set conversion (type 1 to 852) not supported IMP-00000: Import terminated unsuccessfully 在從導出文件US7ASCII到導入 NLS_LANG設置為ZHS16GBK的過程中,不支持單Byte字符集向多Byte轉換,報出以上錯誤。 6.導入Session字符集應該是導出字符集的超級,否則,專有的字符將難以正確轉換。 7.當數據轉換為導入Session字符集設置以后,如果導入Session字符集不同于導入數據庫字符集,這時還需要最后一步轉換,這要求導入數據庫字符 集是導入session字符集的超級,否則某些專有字符將不能正常轉換。 我們繼續看上面的兩個過程,這里有這樣兩個原則: 1.如果NLS_LANG的設置和數據庫相同,那么數據(在傳輸過程中當然是2進制碼)不經過轉換就直接插入數據庫中。 2.如果NLS_LANG的設置和數據庫不同,那么數據需要轉換后才能插入數據庫中。 我們再回頭來看上面的第一個例子: : Export file created by EXPORT:V08.01.07 via conventional path import done in US7ASCII character set and ZHS16GBK NCHAR character set import server uses ZHS16GBK character set (possible charset conversion) export server uses UTF8 NCHAR character set (possible ncharset conversion) . . importing table "TEST" 2 rows imported Import terminated successfully without warnings. 這時候經過第一步轉換后的數據,US7ASCII到ZHS16GBK丟失首位,原樣插入數據庫,我們看到這時數據庫中存放的就是錯誤的字符(在后面部分我們做了詳細的轉換): E:\nls2>sqlplus eygle/eygle SQL*Plus: Release 9.2.0.4.0 - Production on Fri Nov 7 00:35:39 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.7.1.1 - Production With the Partitioning option JServer Release 8.1.7.1.1 - Production SQL> select * from test; NAME -------------------- 2bJT test 在Oracle9i中,以上情況略有不同。 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!