##########################################################AL32UTF8
create user zfj identified by zfj;
grant resource,connect to zfj;
SYS DATA_PUMP_DIR /opt/app/oracle/admin/oratest/dpdump/
grant read,write on directory DATA_PUMP_DIR to zfj;
conn zfj/zfj
create table zfj(yw varchar(10),zw char(10));
insert into zfj values('aaaaaaaaaa','aaaaaaaaaa');
insert into zfj values('b','b');
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
sqlplus zfj/zfj
insert into zfj values ('江苏','江苏');
insert into zfj values ('江苏库','江苏库');
commit;
idle> select * from zfj;
YW ZW
---------- ----------
aaaaaaaaaa aaaaaaaaaa
b b
江苏 江苏
江苏库 江苏库
expdp zfj/zfj directory=DATA_PUMP_DIR file=zfj.dmp logfile=zfj.log
###########################################################ZHS16GBK
create user zfj identified by zfj;
grant resource,connect to zfj;
SYS DATA_PUMP_DIR /opt/app/oracle/admin/oratest1/dpdump/
grant write,read on directory DATA_PUMP_DIR to zfj;
cd /opt/app/oracle/admin/oratest/dpdump
cp zfj.dmp ../../oratest1/dpdump/
impdp zfj/zfj directory=DATA_PUMP_DIR file=zfj.dmp logfile=zfj.log
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
sqlplus zfj/zfj
select * from zfj;
结论:
1.不管是从AL32UTF8 到ZHS16GBK 还是从ZHS16GBK 到AL32UTF8 ,中文都不会乱码,会自动转换(导出导入过程中无报错),但是对于其他国家语言会有问题(比如印度,日本等文字)。
2.通过数据泵导出或导入的数据,与oracle用户操作系统参数NLS_LANG无关,编码自动与数据库参数NLS_CHARACTERSET相同。
3.AL32UTF8 字符集一个中文占用3个字节,ZHS16GBK 字符集一个中文占用2个字节。如果确认应用程序只用到英文和中文,ZHS16GBK会更加节省存储。如果不确定,建议使用AL32UTF8.
4.建表时指定列属性varchar(10),其中的10指的是字节,若是AL32UTF8 字符集,则只能存3个中文,若是ZHS16GBK字符集,则可以存5个中文。这会导致从ZHS16GBK字符集数据库通过数据泵导入到AL32UTF8字符集数据库过程中,有些列需要扩容。如果需要按字符指定列属性,应该为varchar2(10 char)。
5.AL32UTF8是ZHS16GBK的超集,因为AL32UTF8包含了更多国家的文字。
6.通过SecureCRT或xshell查看到中文乱码时,只需要查看数据库NLS_DATABSE_PARAMETERS中NLS_CHARACTERSET的字符集是什么,然后保持操作系统用户NLS_LANG的设置和SecureCRT或xshell软件的编码设置与之一致即可。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31441616/viewspace-2145085/
,如需转载,请注明出处,否则将追究法律责任。