解决方案 »

  1.   

    导出客户机使用 US7ASCII 字符集 (可能的字符集转换)exp导出时最好在使用的客户端也设置好字符集
    可以使用expdp/impdp来导,跳过字符集的问题
      

  2.   

    你好,谢谢指点。
    不过,就目前已经拿到的dmp文件,有没有解决方法呢?徒手操作也行,只要是2天内能够完成的。比如说,我在本地新建一个GBK的实例,导进去。再按照AL32UTF8仅导出用户下的表,为bbb.dmp。
    最后再将bbb.dmp导入新建的 目标实例中。
    我不太了解导入导出的机理,能这样操作吗?如果可以,怎样才能“按照AL32UTF8仅导出用户下的表”呢?
      

  3.   

    如果用al32utf8,可以分两次imp,第一次导入表结构,然后写个存储过程将字符型的字段的长度加长
    第二次导入数据但是有个问题,你的数据可能在exp导出的时候已经发生了字符集转换,不小心已经存在了乱码。还不如重新导出导入一遍。数据量大的话,数据泵的优势更明显或者用gbk字符集确定没有问题的话,就用这个实例好了,没必要再重新导到al32utf8下,user1往usertmp转移数据报错,应该检查两边的表的相关字段定义的长度是不是不一致。指定导入某个用户的数据,在imp中指定参数fromuser和touser即可
      

  4.   


    对不住各位啊 经过最新确认,上家拿来的ppp.dmp文件与我当时查询的数据库出自不同的服务器
    真实的源库字符集是GBK。
    大家海涵~~
    (ง •̀_•́)ง那么现在问题就回归到(第一回)了,kettle转移数据时为啥会报错。
    检查了一下个别出错的字段,发现,user1与usertmp中,表相应的字段定义有细微差别,(在plsql developer中显示表结构)
    比如字段  AAA:
           user1 中为       AAA  varchar2(10 char);
           但usertmp中则为  AAA  varchar2(10);          --这个是kettle检测源表结构自动生成的。
    这里就不太懂了,我们定义表字段的时候不是一般都是 BBB  varchar2(10),  就行了吗?
    多出个char的这种情况是建表人通过 BBB  varchar2(10 char), 这样的语句定义的吗?
      

  5.   

    varchar2(10)=varchar2(10 byte)
    和varchar2(10 char)是不一样的
    比如在GBK字符集下,一个汉字占2个字节。一个“一二三四五六”在user1中能正常插入,应为6个字符小于10个字符的限制,在usertmp中就会报错,因为6个汉字占12个字节,超过了10个字节的限制
      

  6.   

    也就是说,建表人建表时是指定了字段的长度单位为char了。
    建表人用到的是create table AAA( varchar2(10 char)); 这样的语句。对不?那这样问题就的确出在kettle 自动生成的建表语句上了我再想想怎么改kettle的实现方式
    恩。感谢。结贴~