Mysql中文乱码


Posted on February 13, 2008


买一空间,有200M Mysql数据库,但是网站程序是asp.net(c#),连接出现中文乱码,主机分配给用户一个帐号,可以使用phpMyAdmin操作Mysql,

Mysql的信息如下,

运行:SHOW VARIABLES LIKE ''character_set_%'';
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir D:\mysql\share\charsets\

运行SHOW VARIABLES LIKE ''collation_%'';
Variable_name Value
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server latin1_swedish_ci

在网站web.config里,已经配置了:
<globalization requestEncoding="utf-8" resp fileEncoding="utf-8"/>

但是读写数据库仍然是乱码,非常头疼!

在phpMyAdmin里面的SQL操作页面里面直接输入INSERT语句,中文能正确插入,为什么在程序里就不行呢?

我在自己的机子上调试的时候,是可以正常运行的,但Mysql配置有所不同,就是
character_set_server和collation_server都utf8格式,难道是这个问题?但是也不知在虚拟主机上,也不知怎么改...


历经多日的麻烦终于没有了,原来对Mysql失望极了,现在问题解决了,看法也改观,对当初选择C#+Mysql的设计方法,现在想想还是相当不错的.

说正题,问题解决了,我把解决的方法写一下,希望对大家有所帮助.

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:

mysql> SHOW VARIABLES LIKE ''character_set_%'';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                    |
+--------------------------+-------------------------------------------+
| character_set_client    | latin1                                    |
| character_set_connection | latin1                                    |
| character_set_database  | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | latin1                                    |
| character_set_server    | latin1                                    |
| character_set_system    | utf8                                      |
| character_sets_dir      | D:MySQLMySQL Server 5.0sharecharsets |
+--------------------------+-------------------------------------------+
8 rows in set (0.06 sec)

mysql> SHOW VARIABLES LIKE ''collation_%'';
+----------------------+-------------------+
| Variable_name        | Value            |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database  | latin1_swedish_ci |
| collation_server    | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.02 sec)

上面列出的值就是系统的默认值。latin1默认校对规则是latin1_swedish_ci,默认是latin1的瑞典语排序方式.
为什么呢默认会是latin1_swedish_ci呢,追溯一下mysql历史很容易发现(大家可以百度一下)

相信如果mysql是中国开发的,那么汉语也是默认编码了

当然我们也可以自己需要修改mysql的默认字符集
在mysql配置文档my.ini,找到如下两句:

[mysql]

default-character-set=latin1



# created and no character set is defined
default-character-set=latin1

修改后面的值就可以。

这里不建议改,仍保留默认值
也就是说启动 mysql时,如果没指定指定一个默认的的字符集,这个值继承自配置文件中的;
此时 character_set_server 被设定为这个默认的字符集; 当创建一个新的数据库时,
除非明确指定,这个数据库的字符集被缺省设定为 character_set_server; 当选定了一个数据库时,
character_set_database 被设定为这个数据库默认的字符集; 在这个数据库里创建一张表时,
表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集。

这样问题就随之而来了,我的数据库原来是latin1编码。因为在建库建表的时候,没有用明确的语言说明编码方案,如果访问数据库时没指定其的字符集是utf8。自然是乱码,使用SQL语句:

alter database da_name default character set ''charset''.

或者在建表的时候指定也可以:

CREATE TABLE tablename(
......
)DEFAULT CHARSET=utf8;


可以改编码.

在网站web.config里,已经配置了:
<globalization requestEncoding="utf-8" resp fileEncoding="utf-8"/>

所以编码自然是UTF8了

不过就算这样,问题还没有解决,郁闷,想来想去不明白,以为是MySql.Data.dll有BUG,就百度Google到处找答案,没有任何结果.

心恢意冷的时候,想想是不是在连接的时候,使用MySql.Dat连接时没有告诉Mysql用的是什么编码?

朝着这个方向想下去,解决了...

连接字符串时,应该加上编码:

<add key="MySqlConnectionString" value="Server=X.X.X.X;user id=XXXX;password=XX;database=DATABASENAME;charset=utf8"/>

希望遇到同样问题的时候,能给大家帮助


标签:SQLSQL

其它推荐日志:

IIS HTTP 500 内部服务器错误 服务器无法加载应用程序 ''/LM/W3SVC''''/LM/W3SVC'' ''找不到指定的元数据

ASP.NET 2.0中CSS失效解决方案

找不到可安装的ISAM的解决方法

关于ASP.NET中用Response.Write()方法响应导致页面字体变大的问题

搞定CSS SPAN和DIV的区别

在关键字 ''User'' 附近有语法错误。

在sql里设定默认时间

windows也能拥有Vista 侧边栏效果

关于“System.NullReferenceException: 未将对象引用设置到对象的实例”问题原因

一行代码杜绝iframe挂马

javascript中的parseInt

VirtualBox already exists in the media registry解决方案

访问IIS元数据库失败

升级sp3后出现"一个问题阻止windows正确检测此机器许可证"

正则表达式

找回“显示桌面”快捷方式

IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败

在javascript中设置body的onload事件

将VIEWSTATE保存在服务器端,减少网络传输负载

Windows 2003安装iis,设置iis

RegularExpressionValidator控件

(转)在网页上显示缩略图

动态绑定数据的DropDownList控件取值问题

c#链接数据库的问题

RequireFieldValidator控件验证相应的输入框是否为空

HTTP 错误 404 - 文件或目录未找到。的最终解决方法。

介绍一个web2.0站点模板

关于aspnet连接ACCESS的一些小结!

BitComet Beta 20070528

Flash实现无刷新上传的方法

ASP.NET 2.0中嵌套母版页的应用

个人网站建设步骤

WinRAR 3.70 Final

只可以数字的正则表达式!

修理Vista:音乐文件夹变黄了怎么办?

ASP.NET图片防盗链的方法

修理Vista:删除新建“快捷方式”

sql语句中不能随便回车

居然中了wscriptexe病毒~~~

转载:Sizeof与Strlen的区别与联系


Name:
[Emotion-007]同样的问题,有望解决。。
Min
[Emotion-001]
Search
最新评论
推荐日志
微信扫一扫