• ORACLE EXP/IMP的使用详解 (解决9i(window)导入到10G的乱码问题)


    导出/导入与字符集

      进行数据的导入导出时,我们要注意关于字符集的问题。在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。

      我们首先需要查看这四个字符集参数。

      查看数据库的字符集的信息:

      SQL> select * from nls_database_parameters;

      PARAMETER                       VALUE

      ------------------------------ --------------------------------------------------------------------------------

      NLS_LANGUAGE                    AMERICAN

      NLS_TERRITORY                    AMERICA

      NLS_CURRENCY                    $

      NLS_ISO_CURRENCY                AMERICA

      NLS_NUMERIC_CHARACTERS          .,

      NLS_CHARACTERSET                ZHS16GBK

      NLS_CALENDAR                    GREGORIAN

      NLS_DATE_FORMAT                 DD-MON-RR

      NLS_DATE_LANGUAGE               AMERICAN

      NLS_SORT                          BINARY

      NLS_TIME_FORMAT                 HH.MI.SSXFF AM

      NLS_TIMESTAMP_FORMAT            DD-MON-RR HH.MI.SSXFF AM

      NLS_TIME_TZ_FORMAT              HH.MI.SSXFF AM TZH:TZM

      NLS_TIMESTAMP_TZ_FORMAT         DD-MON-RR HH.MI.SSXFF AM TZH:TZM

      NLS_DUAL_CURRENCY               $

      NLS_COMP                        BINARY

      NLS_NCHAR_CHARACTERSET          ZHS16GBK

      NLS_RDBMS_VERSION               8.1.7.4.1

      NLS_CHARACTERSET:ZHS16GBK是当前数据库的字符集。

    我的windows oracle编码为:

    NLS_NCHAR_CHARACTERSET        AL16UTF16
    NLS_CHARACTERSET        ZHS16GBK

      我们再来查看客户端的字符集信息:

      客户端字符集的参数NLS_LANG=_< territory >.

      language:指定oracle消息使用的语言,日期中日和月的显示。

      Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。

      Characterset:控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。或者对于unicode应用设为UTF8。

      在windows中,查询和修改NLS_LANG可在注册表中进行:

      HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\

      xx指存在多个Oracle_HOME时的系统编号。

    我这里的windows默认为:

    windows Client:
    NLS_LANG    SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    在Linux redhat5中:

    [oracle@ucit ~]$ cd       注意:cd 后是空格没有任何内容
    [oracle@ucit ~]$ vi .bash_profile

    加上:

    export NLS_LANG="Simplified Chinese_China".ZHS16GBK    注意:四个端的参数编码要一致


     

    然后使用:env|grep NLS_LANG看正确没有

      在unix中:

      $ env|grep NLS_LANG

      NLS_LANG=simplified chinese_china.ZHS16GBK

      修改可用:

      $ export NLS_LANG=AMERICAN_AMERICA.UTF8

      通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时,主要有以下两种情况:

      (1)     源数据库和目标数据库具有相同的字符集设置。

      这时,只需设置导出和导入端的客户端NLS_LANG等于数据库字符集即可。

      (2)     源数据库和目标数据库字符集不同。

      先将导出端客户端的NLS_LANG设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的NLS_LANG设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。

      这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。

      不同版本的EXP/IMP问题

      一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:

      1、在高版本数据库上运行底版本的catexp.sql;

      2、使用低版本的EXP来导出高版本的数据;

      3、使用低版本的IMP将数据库导入到低版本数据库中;

      4、在高版本数据库上重新运行高版本的catexp.sql脚本。

      但在9i中,上面的方法并不能解决问题。如果直接使用低版本EXP/IMP会出现如下错误:

      EXP-00008: orACLE error %lu encountered

      orA-00904: invalid column name

      这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261722,你可以到METALINK上去查看有关此BUG的详细信息。

      BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。

      Create or REPLACE view exu81rls

      (objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)

      AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,

      decode(bitand(r.stmt_type,1), 0,'', 'Select,')

      || decode(bitand(r.stmt_type,2), 0,'', 'Insert,')

      || decode(bitand(r.stmt_type,4), 0,'', 'Update,')

      || decode(bitand(r.stmt_type,8), 0,'', 'Delete,'),

      r.check_opt, r.enable_flag,

      DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)

      from user$ u, obj$ o, rls$ r

      where u.user# = o.owner#

      and r.obj# = o.obj#

      and (uid = 0 or

      uid = o.owner# or

      exists ( select * from session_roles where role='Select_CATALOG_ROLE')

      )

      /

      grant select on sys.exu81rls to public;

      /

      可以跨版本的使用EXP/IMP,但必须正确地使用EXP和IMP的版本:

      1、总是使用IMP的版本匹配数据库的版本,如:要导入到817中,使用817的IMP工具。

      2、总是使用EXP的版本匹配两个数据库中最低的版本,如:从9201往817中导入,则使用817版本的EXP工具。

  • 相关阅读:
    软件测试七年之痒,依然热爱!我还是从前那个少年!
    我想从功能测试转向自动化测试,怎么办?
    python中的一些内置函数
    python中eval()
    集合
    列表的切片:取出来还是一个列表,可用在复制列表元素的操作
    字符串常用的方法
    dict字典,以及字典的一些基本应用
    list列表(也叫数组),以及常用的一些方法
    jsonpath的用法
  • 原文地址:https://www.cnblogs.com/jifeng/p/1700577.html
Copyright © 2020-2023  润新知