影响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.****.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.****.net/shen020453/article/details/51013408
oracle exp/imp 字符集 http://www.cnblogs.com/chinhr/archive/2010/01/19/1651502.html