一个可怕的跨库访问字符集问题,请各位兄弟帮忙!万分感谢!我使用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中的某些数据作比较,因此必须在同一个界面下同时访问两个数据库。请问各位大哥我这样的问题如何解决?谢谢了!
而在一个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中的某些数据作比较,因此必须在同一个界面下同时访问两个数据库。请问各位大哥我这样的问题如何解决?谢谢了!
解决方案 »
- 关于远程访问orcale数据库
- 求一和SQL语句!!帮帮忙啊!在线等
- oracle 动态构件查询语句
- oracle数据库 求SQL语句
- 问一个比较弱质的问题啊,.Net开发的时候,装了oracle data provider for .net 还需要装Orcle客户端吗?
- oracle 10g安装时,无法确定主机ip地址?
- oracle的安装问题
- 帮我看看存储过程错在哪里?
- 有数据的字符型转换成可能大于4000的数据类型应该怎样去转换呢!
- 为什么sqlstr varchar2(30000);,sqlstr长度超过255就会出错
- 跨表有条件的插入数据
- Oracle为什么函数返回的字符串不能作为where子句的条件
ZHS16GBK可以直接存GBK
之后比较的时候把两个都转化成为unicode
ZHS16GBK可以直接存GBK
之后比较的时候把两个都转化成为unicode
------------------------------------------------------------------问题是我根本没办法读出US7ASCII的原始数据,都被oracle篡改过了