理论基础:
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.
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.
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# 去读就是有乱码。
访问相同的数据库,相同的表。PHP中使用“set names utf-8;” 和 “set names latin1” 均可正常访问。
而 C# winform中 set names gb2312;或者set names utf8;或者set names GBK;或者set names latin1;都不行,都是乱码。数据库中的中文内容在CMD命令提示符 和 PHPMyAdmin 中都显示为乱码。
或者你看下你程序的mysql驱动 和 同事php的 是否一致?
c# 里面使用set names latin1; 再经过Encoding.UTF8.GetString(Encoding.GetEncoding("latin1").GetBytes(_DS32.GetString("setting_value")));
转换可以看到个别中文字符可以读出来了,但是其他中文字符都乱码了。
现在统一设置成了latin1,这个数据库是web采集的,同事在webconfig.php里面用mysql_query("SET NAMES 'utf-8'");来存储。我现在读的是现成的数据了,改不了数据库里面的东西。
既然Sqlyog 和 PHP 都读出了,数据应该是没有问题。我怀疑是latin1 转到utf-8 时出现了问题。不知该怎么转了
{
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);
}
winform貌似没有web.config文件。我是在winform中来访问数据库的。
但是PHP的也一条一条手动地把读取到的数据转成了utf8。。谢谢大家的帮助 (*^__^*)
==》
我以前处理过,要在连接串后面跟编码方式,
public static MySqlConnection conn = new MySqlConnection("server=localhost;UserId=root;password=mypsd;Database=ccc;charset=latin1;connection timeout=3600;charset=gb2312");我刚搜索了下,你把连接串改成这样,存取中文就不会乱码了