一个可怕的跨库访问字符集问题,请各位兄弟帮忙!万分感谢!我使用delphi7编的程序需要访问两个数据库,一个自己的数据库A是oracle9i,字符集SIMPLIFIED CHINESE_CHINA.ZHS16GBK,另外一个B是客户原有的oracle8i数据库,字符集是American_America.US7ASCII,不幸的是,也存储了中文。现在的客户需求是,需要在同一个界面上比较两个数据库中传过来的两张表。很明显,本地客户端字符集设为ZHS16GBK 服务器A的数据显示不正确,设为US7ASCII 服务器B的数据显示不正确。
而在一个oracle session中动态改变数据库的字符集设置的方法我还没有找到!另外,我在服务器A中设了一个dblink指向服务器B,然后在sqlplus中一起正常(除了中文乱码),在delphi程序中就显示:ORA-02041:客户数据库未开始一个事务处理 ,在网上查了下,有人说“把连接串中的驱动程序Provider=OraOledb.Oracle.1改成Provider=MSDAORA.Oracle;”可是经我的实验这没有用,难道是oracle的bug吗?我曾经想过自己想办法把乱码恢复,可是发现这是不可能的:
例如在US7ASCII中“中文”两个字是BA BA D7 D6,传到ZHS16GBK时oralce就自作聪明的把每个字节最高位砍掉,改为 3A 3A 57 56,显示出来就是 '::WV',而服务器B输入的字符即可能是中文也可能是英文,比如服务器B输入'文WV',传到服务器A就变为'WVWV',也就是说数据发生了不可恢复的损失,我也不能自作聪明的将每个字符的最高位补上,那样会破坏服务器B中的英文数据。   我的问题的一些其他要求是:
1.服务器B由另外的专人管理,我不能在上面做任何除了读取数据外的操作;
2.读取服务器B的数据用来让客户方面的和服务器A中的某些数据作比较,因此必须在同一个界面下同时访问两个数据库。请问各位大哥我这样的问题如何解决?谢谢了!

解决方案 »

  1.   

    US7ASCII的话用base64编码中文(自己选一个中文编码)
    ZHS16GBK可以直接存GBK
    之后比较的时候把两个都转化成为unicode
      

  2.   

    US7ASCII的话用base64编码中文(自己选一个中文编码) 
    ZHS16GBK可以直接存GBK 
    之后比较的时候把两个都转化成为unicode
    ------------------------------------------------------------------问题是我根本没办法读出US7ASCII的原始数据,都被oracle篡改过了
      

  3.   

    你试试在delphi中连接两个数据库前分别修改环境变量nls_lang,看看是否可以。