影響Oracle數據庫字符集最重要的參數是NLS_LANG參數。
它的格式如下: NLS_LANG = language_territory.charset
它有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。
其中:
Language: 指定服務器消息的語言, 影響提示信息是中文還是英文
Territory: 指定服務器的日期和數字格式,
Charset: 指定字符集。
公司有兩個Windows環境下的數據庫,版本不同,一個是11g r2,另一個是10g r2,先說說需求:我要從11g r2導出數據庫,導入到10g r2中,要求不能有亂碼問題,包括字段注釋。
1、我先進11g所在系統,導出數據庫。
exp NJ_ZHFW/NJ_ZHFW@10.194.186.14:1521/ORCL file=E:\dmp\NJ_ZHFW20170612.dmp owner=NJ_ZHFW;
2、oracle導出的dmp文件字符集由當前數據庫字符集編碼格式決定的,和客戶端沒關系。
進入服務端查看字符集:select userenv('language') from dual;
如果有dmp文件但進不去數據庫所在系統,那么只能通過查看dmp來確認字符集編碼格式。如何查詢/修改dmp文件的字符集
字符集編碼是:ZHS16GBK
3、知道了dmp文件的字符集是什么了,那么就到10g環境下導入。
a、先查看服務端的字符集編碼,這里是AL32UTF8,是支持中文的編碼,所以不需要改動。
改動服務端編碼請看這里:oracle 修改服務端字符集編碼
b、修改dmp文件版本,因為是從高版本導入低版本,V11.02.00 改成 V10.02.00
c、臨時修改環境變量,在命令行中設置NLS_LANG為環境變量,它將覆蓋注冊表和系統屬性中的NLS_LANG的定義。
在Windows下通過set nls_lang來設置,只是Session級別的,關閉cmd窗口后再打開,就又變為原來的設置了。
注意,在這里我們要將環境變量NLS_LANG的字符集編碼設置成dmp的字符集編碼,這樣我們的cmd窗口作為客戶端才能夠正確編譯dmp文件
echo %NLS_LANG% //查看環境變量
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
d、導入dmp文件
imp NJ_ZHFW/NJ_ZHFW@192.168.28.111:1521/orcl file=D:\Database\NJ_ZHFW20170612.dmp full=y;
參考資源:
Oracle之 dmp導入/導出、數據庫操作等過程中的字符集問題 http://blog.csdn.net/haiross/article/details/18225415
環境變量NLS_LANG http://www.cnblogs.com/justuntil/p/5636574.html
Oracle 客戶端 NLS_LANG 的設置(轉) http://www.cnblogs.com/softidea/p/3974907.html
如何查看查詢oracle字符集、 修改設置字符集以及常見的oracle utf8字符集和oracle exp 字符集問題。 http://blog.csdn.net/shen020453/article/details/51013408
oracle exp/imp 字符集 http://www.cnblogs.com/chinhr/archive/2010/01/19/1651502.html