VS2010里奇怪的MySQL乱码问题

taoisaman 2012-05-18 11:36:38
理论基础:
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.
...全文
541 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_风中雪狼 2012-10-26
  • 打赏
  • 举报
回复

public static MySqlConnection conn = new MySqlConnection("server=localhost;UserId=root;password=mypsd;Database=ccc;charset=latin1;connection timeout=3600;charset=gb2312");


我刚搜索了下,你把连接串改成这样,存取中文就不会乱码了
csdn_风中雪狼 2012-10-26
  • 打赏
  • 举报
回复
具体是utf8还是gb2312 要看你mysql设置的字符集是什么,就跟连接串后面,就是了
csdn_风中雪狼 2012-10-26
  • 打赏
  • 举报
回复
public static MySqlConnection conn = new MySqlConnection("server=localhost;UserId=root;password=mypsd;Database=ccc;charset=latin1;connection timeout=3600;");
==》
我以前处理过,要在连接串后面跟编码方式,
小枪 2012-10-26
  • 打赏
  • 举报
回复
看着晕 等实际遇到情况在仔细学学
taoisaman 2012-07-23
  • 打赏
  • 举报
回复
后面winform的,我用一个页面来转换数据库中的内容,大概是:latin1--->二进制--->utf8 ;
但是PHP的也一条一条手动地把读取到的数据转成了utf8。。



谢谢大家的帮助 (*^__^*)
taoisaman 2012-05-21
  • 打赏
  • 举报
回复
   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);


}
NewUser2008 2012-05-21
  • 打赏
  • 举报
回复
读取出来后,应该也转换编码!
taoisaman 2012-05-21
  • 打赏
  • 举报
回复


如何做到转换之后的字节数量不变呢(都是96B---共32个汉字)
taoisaman 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

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

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

我怀疑是latin1 转到utf-8 时出现了问题。不知该怎么转了
theks 2012-05-21
  • 打赏
  • 举报
回复
MySql的字符集设定有点麻烦,数据库级的、表级的、字段级的,都要统一设定为utf-8才行
taoisaman 2012-05-21
  • 打赏
  • 举报
回复


同样没改数据库里面的数据,但是SQLyog这个软件正常的读出了中文。(它内部是怎么转码的呢?)


c# 里面使用set names latin1; 再经过
Encoding.UTF8.GetString(Encoding.GetEncoding("latin1").GetBytes(_DS32.GetString("setting_value")));

转换

可以看到个别中文字符可以读出来了,但是其他中文字符都乱码了。
只在此山中 2012-05-21
  • 打赏
  • 举报
回复
建议你在数据库所有的都设为 utf8,本机程序可以根据需要设 utf8 或 gbk .
或者你看下你程序的mysql驱动 和 同事php的 是否一致?
taoisaman 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

调整一下web.config中的requestEncoding、responseEncoding试试?
[/Quote]

winform貌似没有web.config文件。我是在winform中来访问数据库的。
diffmaker 2012-05-21
  • 打赏
  • 举报
回复
调整一下web.config中的requestEncoding、responseEncoding试试?
taoisaman 2012-05-21
  • 打赏
  • 举报
回复
补充: 本来是网页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 中都显示为乱码。
taoisaman 2012-05-18
  • 打赏
  • 举报
回复
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# 去读就是有乱码。
ACMAIN_CHM 2012-05-18
  • 打赏
  • 举报
回复
把字符集设置参数加在C#的连接字符串中。
taoisaman 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
理论基础:
MySQL的信息输入路径:client→connection→server;
信息输出路径:server→connection→results→client。

运行环境:Win7 + VS2010 C#(旗舰版)+MySQL 5.5.21 Community Server (GPL)。另外,
SQLyog企业版-MySQL GUI v8.14

表结构:
articl……
[/Quote]
图3 是以为我没有在每一调查询语句里面添加“set names latin1”。

现在剩下图2的乱码问题了

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧