用PB管道导数时乱码

  前天,对一个旧系统进行维护,需要在两个装在Win平台上的Sybase数据库之间导数据,其中有两张表的中有text类型的字段,用BCP或者导出成Insert SQL都没办法完整地把数据导过去。无奈之下,只得求助于PowerBuilder的管道一张张表地导。还有一个问题是我的本本没办法连公司的VPN,只能在另一台机器上安装一个SYbase客户端,再拷一个PB上去,用这台机器做中介,把本本上的数据导到目标数据库里。两张表的数据其实也不多,一张是6021条记录,另一张表是31475条记录,但由于是通过VPN并且使用一个中间机来连公司主机与我的本本之间来导数据,所以导得很慢。好在需要用管道导的表就这两张。
  用PB把管道建立好之后,开始导。导完第一张表之后,我没有去查看一下数据是否正确。因为以往用管道导数据做过很多次,很少出现问题,所以这次也觉得蛮有把握的,所以没有先去查看一下数据,接着就导第二张表了。
  大概过了半小进左右,终于导完了,舒了一口气。为了保险起见,打开应用测试一下。一打开界面,把我吓傻了: 界面上一堆的“?”!咋就乱码了呢?
  赶紧检查是啥原因。
  第一步: 先看JDBC连接URL,没错啊,字符集转换的参数也在啊,用这个URL在MyEclipse里的数据工具查询数据试试,也是乱码...
  第二步: 用PowerBuilder查询数据,数据又能正常显示,到底是咋了?
  第三步: 查看一下两个数据库的字符集,源数据库是cp936,目标库是cp850,这两个不一样。但是,我的本本上的数据是从另外一个Sybase中导出的,那个数据库的字符集与我本本的字符集也不一样啊,咋就不乱码呢? 
  咋办呢?看来只有把两个数据库的字符集改成一样试试。为了保险起见,先把目标数据库的数据用BCP先导出来,免得改了字符集后,目标数据库其他数据都乱了。于是生成一个批处理的BCP脚本开始往外导数据。好慢啊,原来我忘了直接把数据导在目标库的主机上了,而是把数据往我本本上导,不过这已经都导了一小半了,就让他继续导吧,我好好想一下为什么会乱码。按理说,我本本上的数据也是从不同字符集上的库中用管道导过来的,咋不乱码?看来我想改字符集的想法不一定就能解决问题啊,可能另有原因吧。这次导数据与上次把数据导本本上唯一不同之处是上次是用本本上的PB来导的,而这次用一台中间机并新装了一个Sybase客户端。该不是新安装的SYbase客户端有问题吧。看看再说,打开Sybase客户端的locales.dat,找到[win32s]那一段,看到 locale = default, us_english, cp936,这个默认字符集与目标库的字符集不一样。而往本本上导时,用的是本本上的PB,PB调用的字符集与目标库是一致的,会不会是这个导致了乱码呢?试试再说吧。
  停掉BCP进程,把中间机上的默认字符集改成locale = default, us_english, cp850,再重启一下。再打开PB,建好管道,重新开始导这两张乱码的表。
  等...等...等了N久,终于导完了,再打开应用看一下,好了,俺熟悉的方块字终于再次出现了。

  导完了,再回头分析一下原因。原因可能就是中间机在从源数据库读取数据后,把数据按cp936的编码方式insert到目标库中,而目标库的默认字符集却是cp850,而应用中却按照cp850方式从目标库中读取数据从而导致了数据乱码吧。其实这问题本来也不复杂,只是平时遇到的少,偶而碰到一次,没注意这个细节罢了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值