一、错误读出

现象:一个已经存在数据的MySQL数据库,该数据库的数据用系统中其它软件、网页查看均正常,使用MySQLcc之类的客户端查看也正常,可是在新写的网页中总是显示乱码。

分析:其它系统都可以正常查看数据,说明数据本身是没有问题的。在网页中显示乱码,一定是网页的编码字符集和获取到的数据的编码字符集不一至。比如数据库的字符集是UTF8的,而网页的字符集是gb2312的,那么网页就会把UTF8编码的字体串当作gb2312的来处理,结果产生乱码。

解决办法:在连接数据库时,设定连接字符集,使连接字符集和当前网页或客户端程序使用的字符集一致。可以使用MySQL的Set Names指令设定连接字符集。假设网页的字体集为gb2312。在连接MySQL后,在连接上执行如下SQL语句:

Set Names ‘gb2312’

在以后所有这个连接上的查询,MySQL都会自动把数据库中的数据转换成gb2312编码格式传过来。

二、错误写入

现象:一个网页或程序向一个MySQL数据库中写数据,写完后,这个网页或程序自己可以正常读取数据,而从其它客户端或网页中读取数据都是乱码。

分析:其它的正常的客户端出现乱码,说明数据库中的字符编码不对。写数据的那个网页能正常读取,是因为写和读都用了错误的编码格式,将错就错,反而能读出正确的数据了。比如数据库中设定的字符集为UTF8,而网页使用gb2312编码执行了插入数据的SQL,那么MySQL就会把这些gb2312的编码当成是UTF8的编码写进数据库。当其它客户端访问数据时,会按系统的设定,以UTF8 格式读取数据,而数据其实是使用gb2312编码的,结果就出现了乱码。只有写数据的那个网页会把这些数据当成gb2312的,也只有那个网页能正常显示数据。

解决办法:同第一条,即:使用Set Names指令设定连接字符集。

在设定了连接字符体的连接上执行数据操作,所有的数据都将被MySQL自动、正确地转换为数据库中设定的编码格式保存。

通过以上两点,我们可以看到,只要在连接MySQL时,正确地设定了字符集,无论数据库本身是使用什么格式编码的,都能得到正确的结果。也许有人会以为写数据时设定的字符集必需和读数据时一致,事实上完全没有必要。程序所要做的只是告诉 MySQL,目前操作MySQL使用的是什么字符集即可。因为MySQL会自动完成如下的转换工作:

写数据库时用的字符集-->存诸数据的字符集-->读取数据的字符集。

笔者以为MySQL对多语言字符集的处理是非常优秀的,并且每次建立到MySQL的连接都会立刻使用Set Names设定字符集,然而最近还是出现了一回乱码,如下面所述。

三、无知的程序包

现象:使用C#编程,使用MySQL提供的连接程序库包访问数据库,使用 MySqlConnection类连接数据库,连接之后立刻调用Set Names设定连接字符串,然后使用MySqlCommand类执行SQL,并使用MySqlDataReader读取数查询结果。然而,当我调用 MySqlDataReader的成员方法GetString获取数据的时候,发现得到的全是乱码。百思不得其解。

分析:经仔细检查,确信问题没有出在MySQL连接上面,这时我想到了C#中对 string类型的处理。在C#中字符串和C/C++中有很大不同。在C/C++中一个字符就是一个字节,而在C#中,按不同的编码格式,一个字符也可以是多个字节的。比如”啊”就是一个字符,如果一个字符串s=”啊”; 那么s的Length属性为1,而不是C/C++中的2。我想MySQL程序包也许并不知道连接上传过来的字符是什么编码的,它因为无知,所以只是按单字节字符把这些数据组织成一个string,这个生成的string就是我得到的乱码。事实上也的确是这样。

解决办法:把这些数据重新组织起来,然后使用正确的编码方法重新生成string。C#中System.Text包内的Encoding类提供了字符集的编/解码方法。

1)首先还是设定连接字符集,以确认收到的字符的编码方式。

2)把GetString得到的字符串转换到byte数组中。

3)使用Systec.Text.Encoding包中相应字符集的解码方法GetString得到新的字符串。

为了通用性,我们使用System.Text.Encoding的默认字符集。连接数据库时,设置数据库连接字符集使用的SQL指令strSetCharset为如下值:

string strSetCharset = “Set Names ” + System. Text. Encoding .Default. HeaderName;

在获取数据时,使用下面的函数得到真正的字符串:

private string DBStringToNormal(string dbStr)

{

byte[] str = new byte[dbStr.Length];

for (int i = 0; i < dbStr.Length; ++i)

str[i] = (byte)(dbStr[i]);

return System.Text.Encoding.Default.GetString(str, 0, dbStr.Length);

}

-----------------------------------------------------------------------------------------------------------------

看到这个文章受到启发,重要的一句是:

通过以上两点,我们可以看到,只要在连接MySQL时,正确地设定了字符集,无论数据库本身是使用什么格式编码的,都能得到正确的结果。也许有人会以为写数据时设定的字符集必需和读数据时一致,事实上完全没有必要。程序所要做的只是告诉 MySQL,目前操作MySQL使用的是什么字符集即可。因为MySQL会自动完成如下的转换工作:

写数据库时用的字符集-->存诸数据的字符集-->读取数据的字符集。

由此想我的问题可能是写入时声明的我的字符编码与我实际的不符,C#中字符默认编码为GB2312,于是程序改动如下:

1:在链接字符加入字符编码声明

向mysql说明我的字符编码是gb2312, 不要搞错

2:在数据库类中每一插入数据语句前加入编码声明

cmd = new MySqlCommand("set names gb2312;"+sql,conn);

cmd.ExecuteNonQuery();

c# mysql 汉字乱码_c#+mysql 中文乱码相关推荐

  1. MySQL 插入数据时,中文乱码问题的解决

    MySQL 插入数据时,中文乱码问题的解决 参考文章: (1)MySQL 插入数据时,中文乱码问题的解决 (2)https://www.cnblogs.com/sunzn/archive/2013/0 ...

  2. jmeter对乱码如何处理_JMeter中文乱码的解决

    对于JMeter中文乱码分为两部分: 1.请求(request):由于引用了csv文件当csv文件编码与JMeter不统一可能造成服务器收到数据的中文乱码 2.返回(response):由于服务器返回 ...

  3. 火狐浏览器中文乱码怎么办 Firefox中文乱码解决方法

    核心提示:最近好多网友反映在使用火狐浏览器的时候,网页显示乱码的情况,这种问题通常是由于我们浏览器语言的设置有关系,下面小编就为大家分析下具体的解决办法,希望对大家有所帮助. 火狐浏览器中文乱码怎么办 ...

  4. tomcat8日志乱码_Tomcat日志中文乱码怎么解决?

    Linux系统中文语言乱码,是很多小伙伴在开始接触Linux时经常遇到的问题,而且当我们将已在Wndows部署好的项目搬到Linux上运行时,Tomcat的输出日志中文全为乱码(在Windows上正常 ...

  5. MySQL 创建函数, MySQL定义函数实现汉字转拼音 MySQL汉字转拼音MySQL汉字生成拼音字符串

    MySQL 创建函数, MySQL定义函数实现汉字转拼音 MySQL汉字转拼音 一.MySQL创建函数 1.语法 CREATE FUNCTION fun_name([paramName type , ...

  6. keil5中文乱码,编译中文乱码,串口调试助手接收中文乱码

    keil5中文乱码,编译中文乱码,串口调试助手接收中文乱码 keil5的文本编辑器输入中文乱码 一般更改编码就可以解决 打开设置界面 更改编码,可以是GBK码,也可以是UTF-8编码 编辑器中文没有乱 ...

  7. HTML编程出现乱码,html中文为什么会乱码?html中文乱码怎么解决?

    html中文乱码一般是因为编码格式不匹配.或没有设置编码造成的.解决方法:1.在HTML文件头中使用meta标签把HTML编码方式设置为utf-8:2.使用网页编辑器打开文件,设置统一的编码格式. 很 ...

  8. 为什么html中文是乱码?html中文乱码怎么解决

    很多程序员在开发网站的时候,都会遇到html文件出现乱码,那么,为什么html中文是乱码?html乱码怎么造成的?html中文乱码怎么解决呢,下面php高手为您解决这些问题. 打造全网web前端全栈资 ...

  9. Java解决下载中文乱码和URL中文乱码问题

    解决浏览器下载中文乱码和URL中文乱码问题 下载中文乱码问题 URL路径中含有中文处理方式: 下载中文乱码问题 中文乱码是个让人头痛的问题,这里整理针对下载时,中文乱码问题,下面是Java对应的实现, ...

最新文章

  1. [Step By Step]使用SLT工具从SAP导入数据到SAP HANA
  2. JS的一些扩展:String、StringBuilder、Uri
  3. python中 s是什么意思_什么是Pandas?Pandas学习什么?
  4. Python_Mix*OS模块,序列化模块种的json,pickle
  5. Java学习日志(23-3-网络编程-TCP)
  6. nokia n1 android 6,诺基亚推Nokia N1拥抱安卓,微软该怎么想?
  7. 计算机系统-函数调用约定/调用规范/传参方式
  8. 中国兽医显微镜市场趋势报告、技术动态创新及市场预测
  9. 移动端安全 - 安卓Android - 工具相关
  10. Android——ViewPager多页面滑动切换以及动画效果
  11. 一个Ext2+SWFUpload做的图片上传对话框收藏
  12. antd vue 位置变动 固钉消失_使用vue封装固钉Affix组件,滚动条到底部时自动吸附,离开底部时自动相对窗口固定...
  13. linux(三剑客之sed) sed字符串替换命令详解
  14. git合并——衍合于挑拣(cherry-pick)——只合并某个commit
  15. airpods 升级固件版本_如何查看/更新AirPods的固件版本?AirPods升级查看固件新手教程...
  16. 探索Selenium打开浏览器加载慢的原因
  17. 字节编程题 雀魂启动
  18. 如何在 ggplot2 中制作饼图(附示例)
  19. Java语言西安交大高起专_2018年西安交大网络学院高起专/本英语入学考试复习题...
  20. [Android Pro] 将你的安卓手机屏幕共享到PC或Mac上

热门文章

  1. utilities(matlab)—— 多元函数的数值梯度
  2. vue 心跳监控_Vue中WebSocket加入心跳机制
  3. etl构建数据仓库五步法_构建数据仓库五步法
  4. python下载官网-Python2.7.10
  5. python日常能做什么-Python除了做AI、还能干啥?
  6. 横向对比5大开源语音识别工具包,CMU Sphinx最佳
  7. 语音识别模块 LD3320
  8. python中可以使用变量来引用函数-python如何引用其他py文件里的函数
  9. 马克思知识点总结(一)
  10. Vue编写添加用户的表单 ~ 不要错过哦