我在使用sqlplus的spool方法到出表中的数据到文件中的时候,当char型字段中含有0x00时,导出的文件中0x00变为0x20(空格)了,比如char型字段中有如下数据:
"a a"(两个a中间不是空格,是0x00,这个char型字段中存放的就是'0x61 0x00 0x61'),但是使用spool导出到文件后的数据变为'0x61 0x20 0x61',两个a中间的0x00变为空格0x20了
(我在win下面的oracle, linux下面的oracle都试过了,都存在同样的问题)请问有什么方法可以让spool按数据最原始的形态导出,不被改变啊?请大家帮帮忙,在此谢谢各位了

解决方案 »

  1.   

    试试这个工具来导出看看:http://www.anysql.net/ociuldr.html
      

  2.   

    建议在数据库里面不要使用char类型,全部使用varchar2代替,即使是char(1)也用varchar2(1)代替!
      

  3.   

    不清楚你的情況 我在win2000下用sqlplus導出的都是對應的字符沒有像你說的 a會變成 0x61
      

  4.   

    to NinGoo
    呵呵,谢谢,但是这种第三方工具不让随便用to zhpsam109:
    用过char,varchar2与blob这三种字段,都是这样,spool导出后0x00变成0x20最后用Oracle的函数包ULT_FILE的写文件方法,解决了问题
    写一个存储过程,开一个游标,读一条数据,然后用UTL_FILE的PUT_LINE方法把这条数据写到文件中,
    这样不会出现0x00变成0x20的情况。我估计是因为spool处理类似类似与重定向功能,把本来屏幕上的东西输出到文件中,但是还是会经过一次终端的Shell外壳,
    所以产生了0x00变成0x20的问题,但是如果使用函数包UTL_FILE,把得到的数据直接写道文件中(就像C语言的fprintf,fputs一类的处理方式),不经过终端的Shell外壳,
    这样就不会发生字符编码的变化
    to chentony不好意思,可能我没有说清楚,我的意思不是说导出后a变成0x61,因为0x61就是a(0x61就是十进制的65,65就是a的ASCII码),
    我的意思是说如果字段中的内容是'a a',两个a中间那个不是空格(0x20),是0x00,所以按照ASCII来说就是0x61 0x00 0x61但是用sqlplus的spool方法导出成文件后,文件看上去的内容虽然还是'a a',但是中间的已经不是0x00了,变成空格符了0x20了,就是说成为0x61 0x20 0x61你可以用UltraEdit编辑器,切换到Hex编辑模式,编辑出0x61 0x00 0x61与0x61 0x20 0x61的记录出来,然后切换到普通模式,看上去是一样的,实际上不是一个东西
    补充一点,0x20就是空格的ASCII码,0x00就是C语言中的字符串终止符'\0'