日期:2014-05-16  浏览次数:20514 次

dotnet读sybase数据库乱码问题一解

两年前,在项目中因要从另一厂商系统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两位朋友。