这二天程序部分做到数据了,程序使用了unicode编码,这里到mysql数据库里读数据时,打印出来的老是乱码,前面不管是字符还是字符串,打印的都是乱码,后面查了下,感觉mysql默认的字符集为latin1,但想想,就算默认的也应该支持字符吧,现在只能打钱数字,然后我的程序又是unicode的,直接查看show variables like '%char%';显示的字符集全为latin1.

后来使用set names utf8,把它改为utf8的了,但它只是暂时的,断开后连接又变成latin1了,没办法,懒的每次都改,使用mysql工具直接把默认的字符集改成utf8的。

现在显示如下:

Unicode VC程序下读取mysql数据库内容为乱码的问题_第1张图片


这样把字符集改成UTF8后,创建数据库和建表时的字符集都要使用一致的,这样不管用工具还是用CMD下的命令行查看,就都不会有乱码了.

创建UTF8数据库时后面加上:default character set utf8 collate utf8_general_ci;

如果是GBK的后面加上: default character set gbk collate gbk_chinese_ci;


然后建表的时候后面加上:ENGINE=InnoDB DEFAULT CHARSET=utf8

这样插入和显示中文就没有问题了.


数据库的字符集为utf8了,但程序还是乱码,资料一查,感觉取unicode的数据与非unicdoe的数据不一样,需要用MultiByteToWideChar函数做个转换。


最后每个读取数据的前面都要加上set names gb2312;不知道为什么是gb2312而不是utf8呢,不解,知道的告诉下,谢谢。

这样读出来的数据就是正常的了。


来个总结,让大家看的更清楚,HOOH:

1.mysql中,在my.ini 中修改客户端和服务端的default-character-set=utf8。

2.创建表格时后面加上DEFAULT CHARSET=utf8

然后程序里

如果是unicode程序就做个转换,如果不是就直接读就行了。

只要在读的前面加上set names gb2312就行了。

下面把转换程序贴出来,这个是在网上找的,表示对原创的尊敬,最下面放上原贴地址:

Unicode版代码:
                                                                                                                                                                                               
 sql = "select username,visitelist,remark from mytable";
                                                                                                                                                                                               
 if(mysql_query(&mysql, sql)!=0)
                                                                                                                                                                                               
 {
                                                                                                                                                                                               
  MessageBox(_T("读取表出错!"));
                                                                                                                                                                                               
  return; 
                                                                                                                                                                                               
 }
                                                                                                                                                                                               
 if(!(result = mysql_use_result(&mysql)))
                                                                                                                                                                                               
 {
                                                                                                                                                                                               
  MessageBox(_T("读取数据集失败!"));
                                                                                                                                                                                               
  return;  
                                                                                                                                                                                               
 }
                                                                                                                                                                                               
 int i = 0;
                                                                                                                                                                                               
 CString tmp;
                                                                                                                                                                                               
 WCHAR wsz[100];
                                                                                                                                                                                               
 unsigned long *nLength;
                                                                                                                                                                                               
 while(row = mysql_fetch_row(result))
                                                                                                                                                                                               
 {
                                                                                                                                                                                               
  //ANSI > Unicode
                                                                                                                                                                                               
  // 获取结果字段的长度
                                                                                                                                                                                               
  nLength = mysql_fetch_lengths(result);
                                                                                                                                                                                               
  // 获取结果集中第一个字段的内容
                                                                                                                                                                                               
  MultiByteToWideChar(CP_ACP,0,row[0],nLength[0]+1,wsz,sizeof(wsz));
                                                                                                                                                                                               
 // tmp.Format(_T("%s"),row[0]);
                                                                                                                                                                                               
  m_list.InsertItem(0, wsz);
                                                                                                                                                                                               
  nLength = mysql_fetch_lengths(result);
                                                                                                                                                                                               
  MultiByteToWideChar(CP_ACP,0,row[1],nLength[1]+1,wsz,sizeof(wsz));
                                                                                                                                                                                               
 // tmp.Format(_T("%s"),row[1]);
                                                                                                                                                                                               
  m_list.SetItemText(0, 1, wsz);
                                                                                                                                                                                               
  nLength = mysql_fetch_lengths(result);
                                                                                                                                                                                               
  MultiByteToWideChar(CP_ACP,0,row[2],nLength[2]+1,wsz,sizeof(wsz));
                                                                                                                                                                                               
 // tmp.Format(_T("%s"),row[2]);
                                                                                                                                                                                               
  m_list.SetItemText(0, 2, wsz);
                                                                                                                                                                                               
  i++;
                                                                                                                                                                                               
 }
                                                                                                                                                                                               
 mysql_free_result(result);

原贴地址:http://blog.csdn.net/tukidrmyd/article/details/4522152


OK,这就没什么了,希望和大家多多交流。