用MFC链接mysql数据库读取出来的中文字总是乱码,跪求解决方法

时间:2022-02-25 06:48:20

链接数据库代码
	//初始化MySQL库
if (0 != mysql_library_init(0, NULL, NULL))
{
MessageBox(_T("mysql_library_init失败"));
return -1;
}
//初始化MySQL句柄
if (NULL == mysql_init(&mysql))
{
MessageBox(_T("mysql_init失败"));
return -2;
}
//初始化MySQL字符串
if (0 != mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8"))
{
MessageBox(_T("mysql_options失败"));
return -3;
}
//链接mysql
if (NULL == mysql_real_connect(&mysql, "localhost", "root", "123456", "my", 3306, NULL, 0))
{
MessageBox(_T("mysql_real_connect失败"));
return -4;
}

读取操作后的数据库结果集代码
	res = mysql_store_result(&mysql);	// 存储结果集
if (NULL == res)  
{  
MessageBox(_T("mysql_store_result失败"));
return -1;  
}
while (row = mysql_fetch_row(res)) // 重复读取存储的结果集,逐行读取结果集
{
m_name = row[0];
m_class = row[1];
m_num = row[2];
m_mark = row[3];
m_list.InsertItem(i,  m_name);   
m_list.SetItemText(i, 1, m_class);   
m_list.SetItemText(i, 2, m_num);
m_list.SetItemText(i, 3, m_mark);
i++;
}


用MFC链接mysql数据库读取出来的中文字总是乱码,跪求解决方法用MFC链接mysql数据库读取出来的中文字总是乱码,跪求解决方法用MFC链接mysql数据库读取出来的中文字总是乱码,跪求解决方法

如图所示,在数据库里面已经将所有字符集设置为utf-8了,在数据库里面可以正常显示中文。
在链接数据库的时候也使用了初始化数据库的字符集,但是为什么最后读取出来的中文字就变成了乱码,求各位大神解答一下。
已经试过各种宽窄字节的转换,还是不行。请问是不是项目问题。
PS:我是用VS2010敲的代码。

4 个解决方案

#1


转换一下,MultiByteToWideChar(CP_UTF8, ...); 将UTF8编码的转换成Unicode编码

#2


SELECT  CONVERT(CAST(name AS BINARY) USING 'gbk') ,CONVERT(CAST(class AS BINARY) USING 'gbk'),num,mark FROM student
 
用convert转换下

#3


这不仅仅是宽窄字节的问题,它还有编码转换的问题。为了显示需要将 UTF8 转换成 UNICODE

#4


完整的解决方案:
1. 调用mysql_real_connect()之后调用:mysql_query(&mysql, "set names utf8"); 确保服务器返回utf编码字符串。
2. 调用MultiByteToWideChar()进行转换,并手动添加'\0'。
我的测试代码:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iShowCmd)
{
MYSQL *conn; 
MYSQL_RES *res; 
MYSQL_FIELD *fd; 
MYSQL_ROW row; 
char szSqlText[500]="";
char szBuffer[1024];
conn=mysql_init(0); 
char *temp;
if(conn && mysql_real_connect(conn,"localhost","root","","test",0,NULL,0)) 

mysql_query(conn, "set names utf8"); 
sprintf(szSqlText, "select * from sample"); 
if(mysql_query( conn, szSqlText))//进行数据检索并检查有无错误 

mysql_close( conn ); 
return FALSE ; 

else 

res= mysql_store_result( conn) ;//取得查询结果,保存查询到的数据到res 
while(row = mysql_fetch_row( res))//获取具体的数据,依次读取各条记录
{
sprintf(szBuffer,"%s - %s - %s",row[0],row[1],row[2]);
int wcsLen = MultiByteToWideChar(CP_UTF8, 0, szBuffer, strlen(szBuffer), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
MultiByteToWideChar(CP_UTF8, 0, szBuffer, strlen(szBuffer), wszString, wcsLen);
wszString[wcsLen] = '\0';
MessageBox (NULL, wszString, TEXT("UTF转换测试"),MB_OK);
delete wszString;
}
mysql_free_result(res); //释放结果资源 


else//连接数据库出错 

mysql_close(conn); 
return FALSE; 
}
mysql_close(conn);//断开连接 
return TRUE; 
}

#1


转换一下,MultiByteToWideChar(CP_UTF8, ...); 将UTF8编码的转换成Unicode编码

#2


SELECT  CONVERT(CAST(name AS BINARY) USING 'gbk') ,CONVERT(CAST(class AS BINARY) USING 'gbk'),num,mark FROM student
 
用convert转换下

#3


这不仅仅是宽窄字节的问题,它还有编码转换的问题。为了显示需要将 UTF8 转换成 UNICODE

#4


完整的解决方案:
1. 调用mysql_real_connect()之后调用:mysql_query(&mysql, "set names utf8"); 确保服务器返回utf编码字符串。
2. 调用MultiByteToWideChar()进行转换,并手动添加'\0'。
我的测试代码:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iShowCmd)
{
MYSQL *conn; 
MYSQL_RES *res; 
MYSQL_FIELD *fd; 
MYSQL_ROW row; 
char szSqlText[500]="";
char szBuffer[1024];
conn=mysql_init(0); 
char *temp;
if(conn && mysql_real_connect(conn,"localhost","root","","test",0,NULL,0)) 

mysql_query(conn, "set names utf8"); 
sprintf(szSqlText, "select * from sample"); 
if(mysql_query( conn, szSqlText))//进行数据检索并检查有无错误 

mysql_close( conn ); 
return FALSE ; 

else 

res= mysql_store_result( conn) ;//取得查询结果,保存查询到的数据到res 
while(row = mysql_fetch_row( res))//获取具体的数据,依次读取各条记录
{
sprintf(szBuffer,"%s - %s - %s",row[0],row[1],row[2]);
int wcsLen = MultiByteToWideChar(CP_UTF8, 0, szBuffer, strlen(szBuffer), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
MultiByteToWideChar(CP_UTF8, 0, szBuffer, strlen(szBuffer), wszString, wcsLen);
wszString[wcsLen] = '\0';
MessageBox (NULL, wszString, TEXT("UTF转换测试"),MB_OK);
delete wszString;
}
mysql_free_result(res); //释放结果资源 


else//连接数据库出错 

mysql_close(conn); 
return FALSE; 
}
mysql_close(conn);//断开连接 
return TRUE; 
}