Language:顯示oracle消息,校驗,日期命名
Territory:指定默認日期、數字、貨幣等格式
Client character set:指定客戶端將使用的字符集
例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是語言,AMERICA是地區,US7ASCII是客戶端字符集
2.5.3客戶端字符集設置方法
1)UNIX環境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
編輯oracle用戶的profile文件
2)Windows環境
編輯注冊表
Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE―HOME0
2.5.4 NLS參數查詢
Oracle提供若干NLS參數定制數據庫和用戶機以適應本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通過查詢以下數據字典或v$視圖查看。
NLS_DATABASE_PARAMETERS--顯示數據庫當前NLS參數取值,包括數據庫字符集取值
NLS_SESSION_PARAMETERS--顯示由NLS_LANG 設置的參數,或經過alter session 改變后的參數值(不包括由NLS_LANG 設置的客戶端字符集)
NLS_INSTANCE_PARAMETE--顯示由參數文件init.ora 定義的參數V$NLS_PARAMETERS--顯示數據庫當前NLS參數取值
2.5.5修改NLS參數
使用下列方法可以修改NLS參數
(1)修改實例啟動時使用的初始化參數文件
(2)修改環境變量NLS_LANG
(3)使用ALTER SESSION語句,在oracle會話中修改
(4)使用某些SQL函數
NLS作用優先級別:Sql function>alter session>環境變量或注冊表>參數文件>數據庫默認參數
三.導入/導出與字符集轉換
3.1 EXP/IMP
Export 和 Import 是一對讀寫Oracle數據的工具。Export 將 Oracle 數據庫中的數據輸出到操作系統文件中, Import 把這些文件中的數據讀到Oracle 數據庫中,由于使用exp/imp進行數據遷移時,數據從源數據庫到目標數據庫的過程中有四個環節涉及到字符集,如果這四個環節的字符集不一致,將會發生字符集轉換。
EXP
IMP
四個字符集是
(1)源數據庫字符集
(2)Export過程中用戶會話字符集(通過NLS_LANG設定)
(3)Import過程中用戶會話字符集(通過NLS_LANG設定)
(4)目標數據庫字符集
3.2導出的轉換過程
在Export過程中,如果源數據庫字符集與Export用戶會話字符集不一致,會發生字符集轉換,并在導出文件的頭部幾個字節中存儲Export用戶會話字符集的ID號。在這個轉換過程中可能發生數據的丟失。
例:如果源數據庫使用ZHS16GBK,而Export用戶會話字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,這個轉換過程中,中文字符在US7ASCII中不能夠找到對等的字符,所以所有中文字符都會丟失而變成“?? ”形式,這樣轉換后生成的Dmp文件已經發生了數據丟失。
因此如果想正確導出源數據庫數據,則Export過程中用戶會話字符集應等于源數據庫字符集或是源數據庫字符集的超集
3.2.1 修改dmp文件字符集
上文說過,dmp文件的第2第3字節記錄了字符集信息,因此直接修改dmp文件的第2第3字節的內容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因為改的只是dmp文件,所以影響不大。
具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節。比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對應的16進制代碼:
SQL> select to_char(nls_charset_id(\'ZHS16GBK\'), \'xxxx\') from dual;
0354
然后將dmp文件的2、3字節修改為0354即可。
如果dmp文件很大,用ue無法打開,就需要用程序的方法了。網上有人用java存儲過程寫了轉換的程序(用java存儲過程的好處是通用性教好,缺點是比較麻煩)。我在windows下測試通過。但要求oracle數據庫一定要安裝JVM選項。有興趣的朋友可以研究一下程序代碼
3.3導入的轉換過程
(1)確定導出數據庫字符集環境
通過讀取導出文件頭,可以獲得導出文件的字符集設置
(2)確定導入session的字符集,即導入Session使用的NLS_LANG環境變量
(3)IMP讀取導出文件
讀取導出文件字符集ID,和導入進程的NLS_LANG進行比較
(4)如果導出文件字符集和導入Session字符集相同,那么在這一步驟內就不需要轉換,如果不同,就需要把數據轉換為導入Session使用的字符集??梢钥闯?,導入數據到數據庫過程中發生兩次字符集轉換
第一次:導入文件字符集與導入Session使用的字符集之間的轉換,如果這個轉換過程不能正確完成,Import向目標數據庫的導入過程也就不能完成。
第二次:導入Session字符集與數據庫字符集之間的轉換。
然而,oracle8i的這種轉換只能在單字節字符集之間進行,oracle8i導入Session不支持多字節字符集之間的轉換,因此為了避免第一次轉換,導入Session使用的NLS_LANG與導出文件字符集相同,第二次轉換(通過SQL*Net)支持任何兩種字符集。以上情況在Oracle9i中略有不同
四.亂碼問題
oracle在數據存儲、遷移過程中經常發生字符亂碼問題,歸根到底是由于字符集使用不當引起。下面以使用客戶端sqlplus向數據庫插入數據和導入/導出(EXP/IMP)過程為例,說明亂碼產生的原因。
原文轉自:http://blogread.cn/it/article/4654