oracle字符集问题

使用oracle涉及三个地方字符集 1、oracle服务端字符集 2、oracle客户端字符集 3、dmp迁移文件字符集

一、oracle服务端字符集SQL:
SELECT USERENV(‘language’) FROM DUAL;
or
select * from V N L S P A R A M E T E R S ; 二、 o r a c l e 客户端字符集 1 、 w i n d o w 环境下,修改注册表 O R A C L E H O M E 目录下的环境变量 N L S L A N G 。 2 、 u n i x / l i n u x 环境下,就是环境变量 NLS_PARAMETERS; 二、oracle客户端字符集 1、window环境下,修改注册表ORACLE_HOME目录下的环境变量NLS_LANG。 2、unix/linux环境下,就是环境变量 NLSPARAMETERS;二、oracle客户端字符集1window环境下,修改注册表ORACLEHOME目录下的环境变量NLSLANG2unix/linux环境下,就是环境变量NLS_LANG
[oracle@wang ~]$ echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
三、exp导出文件的字符集是与客户端NLS_LANG参数的值有关的,如果只有exp文件,可用以下方法识别出字符集:

1.在windows上可以用UltraEdit工具打开dmp文件;在linux上,可用cat与od命令结合,查看dmp文件内容,如下:

[oracle@node3 ~]$ cat emp.dmp | od -t x1 | head -2
0000000 03 03 54 45 58 50 4f 52 54 3a 56 31 31 2e 30 32
0000020 2e 30 30 0a 44 53 59 53 0a 52 54 41 42 4c 45 53
查看其第二、三个字节内容,可看到是0354

2.将第一步中的0354转换为十进制
SQL> select to_number(‘0354’,‘xxxx’) from dual;

TO_NUMBER(‘0354’,‘XXXX’)

                  852  

得到852
3.根据得到的十进制数,查看所对应的字符集

SQL> select nls_charset_name(852) from dual;

NLS_CHAR

ZHS16GBK

四、export到import关系到四个字符集
源数据库的字符集——A
export_session的NLS_LANG环境变量——B
import_session的NLS_LANG环境变量——C
目标数据库的字符集——D

  1. A=B时,exp_session不会对源数据库数据进行字符集转换,并把exp_session的字符集(即源数据库字符集)记录到导出文件(导出文件头的第2、3个字节)中。

  2. A!=B时,9I之前的DB exp_session会对源数据库的所有数据进行字符集转换,转换为NLS_LANG的字符集B,并把exp_session的字符集记录到导出文件中;9I及9I以后的DB, exp_session只会对数据字典的内容进行字符集转换,转换为NLS_LANG的字符集B,其他数据仍为源数据库的字符集不变仍为A,还是会把exp_session的字符集B记录到导出文件中。3. B=C时,import_session读dump文件的内容,检查导出时使用的字符集设置,发现与import_session的NLS_LANG相同,则dump文件导入到import_session不做字符集转换。

  3. B!=C时,字符集B在导入到import会话时会转换成字符集C,注意:这种转换只能在单byte字符集之间进行,不支持单到多、多到单、多到多,所以对于多Byte字符集的导入(如:UTF8)需要设置import_Session字符集和import_session字符集相同。import_session字符集应该是export_session字符集的超集,否则,专有的字符将难以正确转换。

  4. C=D时,import_session中的数据不经过转换就直接插入数据库中。

  5. C!=D时,import_session中的数据需要转换后才能插入数据库中。目标数据库字符集是import_session字符集的超集,否则某些专有字符将不能正常转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值