理论基础:
MySQL的信息输入路径:client→connection→server
信息输出路径:server→connection→results→client。运行环境:Win7 + VS2010 C#(旗舰版)+MySQL 5.5.21 Community Server (GPL)。另外,
SQLyog企业版-MySQL GUI v8.14表结构:
article_settings | CREATE TABLE `article_settings` (
 `article_id` bigint(20) NOT NULL,
 `locale` varchar(5) NOT NULL DEFAULT '',
 `setting_name` varchar(255) NOT NULL,
 `setting_value` text,
 `setting_type` varchar(6) NOT NULL,
 UNIQUE KEY `article_settings_pkey` (`article_id`,`locale`,`setting_name`),
 KEY `article_settings_article_id` (`article_id`)
 ENGINE=MyISAM DEFAULT CHARSET=utf8 |字段结构:
+---------------+--------------+-----------------+------+-----+---------+-------
+---------------------------------+---------+
| Field         | Type         | Collation       | Null | Key | Default | Extra
+---------------+--------------+-----------------+------+-----+---------+-------
+---------------------------------+---------+
| article_id    | bigint(20)   | NULL            | NO   | PRI | NULL    |
| locale        | varchar(5)   | utf8_general_ci | NO   | PRI |         |
| setting_name  | varchar(255) | utf8_general_ci | NO   | PRI | NULL    |
| setting_value | text         | utf8_general_ci | YES  |     | NULL    |
| setting_type  | varchar(6)   | utf8_general_ci | NO   |     | NULL    |
+---------------+--------------+-----------------+------+-----+---------+-------
+---------------------------------+---------+
问题描述:
SQLyog里面用“SET NAMES latin1”后,再用select语句查询,即可得到不是乱码的正常中文字符结果。并且此时show variables like “%char%” 可以显示出如图1所示的结果(注意这里的character_set_results)。C#中的操作代码:
public static MySqlConnection conn = new MySqlConnection("server=localhost;UserId=root;password=mypsd;Database=ccc;charset=latin1;connection timeout=3600;");public static MySqlDataReader BindReader(string sqlStr)
        {
            try
            {
                conn.Open();
                MySqlCommand sqlCmd = new MySqlCommand("set names latin1;"+sqlStr, conn);
                MySqlDataReader sdr = sqlCmd.ExecuteReader();
                return sdr;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return null;
            }
        }图1.
在VS2010里面用以下代码链接访问同样的数据库,却得到乱码如图2。并且用MessageBox输出当前的 show variables like “%char% 的结果里面,唯独character_set_results没有值,如图3.查询MySQL后返回的字符串都经过了
private string changeEncoding(string read){
System.Text.Encoding iso8859,gb2312; 
iso8859 = System.Text.Encoding.GetEncoding("latin1"); 
gb2312 = System.Text.Encoding.GetEncoding("utf-8"); 
byte[] iso; 
iso = iso8859.GetBytes(read); 
return gb2312.GetString(iso); 
}的转换。是不是VS2010里面哪里的默认值在搞鬼?还是我的MyS还没设置对?
图2.图3.

解决方案 »

  1.   

    图3  是以为我没有在每一调查询语句里面添加“set names latin1”。现在剩下图2的乱码问题了
      

  2.   

    set names gb2312;
    set names utf8;
    set names GBK;
    set names latin1;
    都试了,还是不行。 
    数据库原来就是latin1的,只有我读的这个字段是utf8的。同事在php里面用
    mysql_query("set names utf8");
    mb_internal_encoding('utf8'); 就可以正常显示。
    而且只要保持Character_set_results = latin1,SQLyog就可以正常读出中文。但我用winform C# 去读就是有乱码。
      

  3.   

    补充: 本来是网页PHP用“set names utf-8;”来存储,现在我要用C#开发个桌面客户端,然后再去读数据库就出现乱码。
    访问相同的数据库,相同的表。PHP中使用“set names utf-8;” 和 “set names latin1” 均可正常访问。
    而 C# winform中 set names gb2312;或者set names utf8;或者set names GBK;或者set names latin1;都不行,都是乱码。数据库中的中文内容在CMD命令提示符  和 PHPMyAdmin 中都显示为乱码。
      

  4.   

    建议你在数据库所有的都设为 utf8,本机程序可以根据需要设 utf8 或 gbk .
    或者你看下你程序的mysql驱动 和 同事php的 是否一致?
      

  5.   

    同样没改数据库里面的数据,但是SQLyog这个软件正常的读出了中文。(它内部是怎么转码的呢?)
    c# 里面使用set names latin1; 再经过Encoding.UTF8.GetString(Encoding.GetEncoding("latin1").GetBytes(_DS32.GetString("setting_value")));
    转换可以看到个别中文字符可以读出来了,但是其他中文字符都乱码了。
      

  6.   

    MySql的字符集设定有点麻烦,数据库级的、表级的、字段级的,都要统一设定为utf-8才行
      

  7.   


    现在统一设置成了latin1,这个数据库是web采集的,同事在webconfig.php里面用mysql_query("SET NAMES 'utf-8'");来存储。我现在读的是现成的数据了,改不了数据库里面的东西。
    既然Sqlyog 和 PHP 都读出了,数据应该是没有问题。我怀疑是latin1 转到utf-8 时出现了问题。不知该怎么转了
      

  8.   

       public string GetEncodingString(string srcString)
            {
                Encoding utf= Encoding.UTF8;
                Encoding lat = Encoding.GetEncoding("latin1");
                
                byte[] lbs =lat.GetBytes(srcString);
                MessageBox.Show(lbs.Length.ToString());      //结果为96
                byte[] cc = Encoding.Convert(lat, utf, lbs);
                MessageBox.Show(cc.Length.ToString());      //结果为163  
                 char[] dstChars = new char[utf.GetCharCount(lbs, 0, lbs.Length)];
                 utf.GetChars(lbs, 0, lbs.Length, dstChars, 0);
                 return new string(dstChars);
             }
      

  9.   

    调整一下web.config中的requestEncoding、responseEncoding试试?
      

  10.   


    winform貌似没有web.config文件。我是在winform中来访问数据库的。
      

  11.   

    后面winform的,我用一个页面来转换数据库中的内容,大概是:latin1--->二进制--->utf8 ;
    但是PHP的也一条一条手动地把读取到的数据转成了utf8。。谢谢大家的帮助 (*^__^*)
      

  12.   

    public static MySqlConnection conn = new MySqlConnection("server=localhost;UserId=root;password=mypsd;Database=ccc;charset=latin1;connection timeout=3600;");
    ==》
    我以前处理过,要在连接串后面跟编码方式,
      

  13.   

    具体是utf8还是gb2312 要看你mysql设置的字符集是什么,就跟连接串后面,就是了
      

  14.   


    public static MySqlConnection conn = new MySqlConnection("server=localhost;UserId=root;password=mypsd;Database=ccc;charset=latin1;connection timeout=3600;charset=gb2312");我刚搜索了下,你把连接串改成这样,存取中文就不会乱码了