一个文档,抽取XML后,xml和文档文件一起存入数据库
表结构开始时是这样
create table TAB_XMLTEST
(
  DOCID   VARCHAR2(20),
  XMLDOC  SYS.XMLTYPE,
  DOCTEXT CLOB
);然后插入取出没问题了,加载文档的时候编辑器一直报错……很奇怪,ultraedit拿插入数据库前的文档和取出的二进制比较,基本完全不同……当时就懵了……后来想起建表时一开始是把xml文本存进DOCTEXT段,然后用存储过程插入XMLDOC段进行强制转换的,或许是CLOB类型有问题?换成BLOB后一切正常网上查CLOB和BLOB的应用都说的很少,只说CLOB是字符大对象Clob 用来存储单字节的字符数据,BLOB用于存储二进制数据,而你往数据库里面插入时也都是用二进制流插入的,都能插入取出……有没有高手来说下区别?字符对象莫非还会进行一次强制转换么?

解决方案 »

  1.   

    说下自己的看法.
    应该是编码层次的问题.
    文本一般来说是定长编码,而且一般来说不会使用到定长二进制串的所有组合.比如一个byte的编码,可能仅仅使用了128个组合,即第一位总是保持为0的,后面7位才有可能为1.(比如标准的ascii编码就只有128个).二二进制文件是各种可能都有.
    这样如果你对一个二进制文件去按上面的文本编码进行解析,势必有部分编码无法解析,导致数据丢失.
      

  2.   

    可能是文档所使用的字符集与数据库的字符集不同,在导入文档时 oracle 自动将其转换为数据库的字符集。而BLOB 类型存储的二进制数据,当然不存在字符集的转换。
      

  3.   


    我一开始想的也是这样,但是中文插入进去可是一切正常的啊,中文双字节肯定不止128了,况且其他文字也是要支持的啊,按理不应该会在这卡住的后来又想二进制串里面是有00位的,如果是字符串这就算是结束了,但是CLOB段确实插入进去了……也算是一个例子吧,CLOB和BLOB不能混用……但是为什么就不知道了……