C# MySql DevExpress开发遇到的编码问题

来源:互联网 发布:plc电路图绘制软件 编辑:程序博客网 时间:2024/06/05 07:46

1、Mysql编码都设置成了UTF8,可通过命令查看:

SHOW VARIABLES LIKE 'character_set_%';

2、Mysql里面存储了有藏文、阿拉伯字母、希伯来文的UTF8编码的文字。在Mysql GUI(Workbench,Navicat)下直接使用SELECT语句,这些文字会显示乱码;
3、使用SET NAMES UTF8; SELECT * FROM tablename;显示依然为乱码;但是使用SET NAMES Latin1; SELECT * FROM tablename;则在GUI下能够正常显示。GUI为Windows下的GUI。
4、使用Dev GridControl显示数据,如果直接绑定数据:

DataTable dt = DB.MyDataTable("SELECT * FROM tablename");

GridControl会显示乱码;
5、使用

DataTable dt = DB.MyDataTable("SET Latin1; SELECT * FROM tablename");gridControl1.DataSource = dt;

GridControl会显示乱码;
6、使用

DataTable dt = DB.MyDataTable("SET Latin1; SELECT * FROM tablename");for (int i=0; i<dt.Rows.Count; i++) {    dt.Rows[i]["col"] = Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").getBytes(dt.Rows[i]["col"]))}gridControl1.DataSource = dt;

GridControl能够正常显示,其中列col为乱码列;
7、更新数据库中的数据,使用

string colContent = "中文";string sql = string.Format("UPDATE tablename SET col='{0}' WHERE id=1", colContent);DB.ExCmd(sql);

执行之后,直接在GUI中,使用SELECT * FROM tablename;,修改的内容能够正常显示,藏文之类的会是乱码,如果使用SET Latin1; SELECT * FROM tablename;,修改的内容乱码,藏文之类的会正常显示。
需要修改更新到数据库中的数据的编码和数据库原有内容保持一致。
8、使用

string colContent = "中文";colContent = Encoding.Unicode.GetString(Encoding.GetEncoding("UTF-16").GetBytes(colContent));string sql = string.Format("SET NAMES Latin1; UPDATE tablename SET col='{0}' WHERE id=1", colContent);DB.ExCmd(sql);

更新数据库中,使用6中的方式将数据绑定GridControl上之后,藏文之类的和更新内容都能够正常显示。
C#字符串默认的编码方式是UTF-16,将其转换到Mysql中UTF8编码,需使用Encoding.Unicode.GetString(Encoding.GetEncoding("UTF-16").GetBytes(colContent));,将Unicode换成UTF8会出现问题。
9、Latin1
Latin1是万能编码,存的是任何字符,连二进制也能存,set names Latin1;, 客户端和服务端的字符集间将不进行任何转换。
要确认客户端能正确显示字符,首先你要确认你的Mysql中服务端Latin1字符以什么编码,然后在客户端进行相应的转换。

Latin1

Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

ISO-8859-1

ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。

原创粉丝点击