日期:2014-05-16 浏览次数:20524 次
两年前,在项目中因要从另一厂商系统sybase数据库抽取数据,在协调好所有格式、内容之后,编码的过程中发现了一个问题:dotnet从sybase数据库读出来的中文是乱码!而使用sybase的SQL Advantage查询出来的数据中文正常,该厂商使用java读出来的数据也正常。我们知道,这是字符集的问题,通过对数据库安装字符集可以解析,但数据库是其他厂商的,我们无法让他们为我们安装需要的字符集。在经过很长时间的网上搜索,使用各种字符集尝试后,最后放弃尝试,通过oracle的透明网关连接解析了该问题。
最近,由于安全性,把oracle从10.2.0.1升级到10.2.0.4之后,透明网关运行不正常,又被迫把oracle还原为10.2.0.1。同时通过oracle的透明网关连接,最近感觉速度好像很慢,而且有时无故连接不上sybase数据库,原因很难查。
于是又萌生了使用原生的sybase连接读取数据的想法:通过java读取数据不乱码,为什么通过dotnet就乱码呢?再一次在网上展开是搜索,http://topic.csdn.net/u/20090603/14/928f0b96-09db-4c49-96c5-4486a448128d.html的第11楼和12楼的回答:
System.Text.Encoding.GetEncoding("gbk").GetString(System.Text.Encoding.GetEncoding("latin1").GetBytes(sss));引起了我的注意。经测,通过这样处理后,解决了dotnet读sybase中文乱码的问题!
于是实现了一个静态工具类:
/// <summary> /// 字符转换 /// </summary> public static class CharConvert { /// <summary> /// 转换sybase的中文乱码为正常可识别的字符 /// </summary> /// <param name="sourceStr"></param> /// <returns></returns> public static string ConvertSybaseCharset(string sourceStr) { return Encoding.GetEncoding("gbk").GetString(Encoding.GetEncoding("latin1").GetBytes(sourceStr)); } public static string ConvertToSybaseCharset(string sourceStr) { return Encoding.GetEncoding("latin1").GetString(Encoding.Default.GetBytes(sourceStr)); } }用于实现sybase字符乱码的处理。
自此,dotnet读sybase中文乱码的问题得到解决,而且经测,通过原生的sybase连接,抽取数据的速度也有不少的提升。
在此记录,供遇到同样问题的朋友参考,避免再像我们一样走的弯路。
再次感谢http://topic.csdn.net/u/20090603/14/928f0b96-09db-4c49-96c5-4486a448128d.html的11楼luito和12楼iihero两位朋友。