mysql中插入和查询汉字时乱码问题解决
时间:2010-10-17 来源:light511
最近做个项目用到MFC+MYSQL,用ODBC插入和查询表中记录,如果带汉字就会出现乱码。各种方法未解决问题。后来换MYSQL的C API做,还有同样的问题。不过经过努力测试问题解决了。原理现在是一知半解,有待深入研究。解决方法如下:
1,安装MYSQL时选UTF8字符集;
2,修改MYSQL的配置文件my.ini中的
[mysql]
default-character-set=gbk
3,重新启动MYSQL服务;
4,在MFC程序中每次连接MYSQL服务器成功后执行如下语句,设置字符集:
char * character_set="set names 'gbk'";
mysql_real_query(&mysql,character_set,(unsigned int) strlen(character_set)); 5,MFC工程属性中字符集设置为UNICODE编码,但是C API函数执行时任然是ASCI编码,所以在程序中要进行转换:WideCharToMultiByte和MultiByteToWideChar这两个函数。例如: //从界面获取值,然后插入数据库中 wchar_t wname[100];
GetDlgItem(IDC_EDIT1)->GetWindowText(wname,50); int iTextLen=WideCharToMultiByte( CP_ACP,0,wname,-1,NULL,0,NULL,NULL);
char * cname=(char*)malloc(iTextLen+1);
WideCharToMultiByte( CP_ACP,0,wname,-1,cname,iTextLen,NULL,NULL); insert(cname); free(cname); //从数据库中获取值显示到前台界面上 qurey(&head); int n=MultiByteToWideChar(CP_ACP,0,head->name,50,NULL,0);
wchar_t* pWideChar=(wchar_t*)calloc(n+1,sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,head->name,50,pWideChar,n);
GetDlgItem(IDC_EDIT3)->SetWindowText(pWideChar); free(pWideChar); 总结,通过这个问题的解决我学习了一些字符编码的知识,收获很大。注意几个地方字符集的编码设置要一直。
mysql_real_query(&mysql,character_set,(unsigned int) strlen(character_set)); 5,MFC工程属性中字符集设置为UNICODE编码,但是C API函数执行时任然是ASCI编码,所以在程序中要进行转换:WideCharToMultiByte和MultiByteToWideChar这两个函数。例如: //从界面获取值,然后插入数据库中 wchar_t wname[100];
GetDlgItem(IDC_EDIT1)->GetWindowText(wname,50); int iTextLen=WideCharToMultiByte( CP_ACP,0,wname,-1,NULL,0,NULL,NULL);
char * cname=(char*)malloc(iTextLen+1);
WideCharToMultiByte( CP_ACP,0,wname,-1,cname,iTextLen,NULL,NULL); insert(cname); free(cname); //从数据库中获取值显示到前台界面上 qurey(&head); int n=MultiByteToWideChar(CP_ACP,0,head->name,50,NULL,0);
wchar_t* pWideChar=(wchar_t*)calloc(n+1,sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,head->name,50,pWideChar,n);
GetDlgItem(IDC_EDIT3)->SetWindowText(pWideChar); free(pWideChar); 总结,通过这个问题的解决我学习了一些字符编码的知识,收获很大。注意几个地方字符集的编码设置要一直。
相关阅读 更多 +