求教MySQL5数据库VC读取中文显示问号

5版本的mysql的可视化工具(APMServ)建一个数据库,在里面建一个表。使用gbk_chinese_ci整理。再用VC从里面读取数据,可是凡是中文在VC列表控件中都... 5版本的mysql 的可视化工具(APMServ)建一个数据库,在里面建一个表。使用gbk_chinese_ci整理。再用VC从里面读取数据,可是凡是中文在VC列表控件中都变成了问号
在MYSQLMySQL3.x版本下建立数据库,中文读取正常显示。
但是公司的数据库是用APMServ写的,经理说不能更改,只能改VC
怎么改?
怎么办
头都大了一圈
我的 QQ是278594439
因为工作的原因,一定要解决这个问题
解决问题之恩
永生难忘...
我明天去公司试试,如果还有问题,一定要帮我解决啊
mysql_query(&m_mysql,"set names \'GBK\'"); 是在MYSQL里面哪里设置呢还是在VC中呢
展开
 我来答
getborn
推荐于2016-11-08 · TA获得超过964个赞
知道小有建树答主
回答量:337
采纳率:0%
帮助的人:460万
展开全部
补充:
你用什么读写MySQL?VC一般是用C API吧。
mysql_query(&m_mysql,"set names \'GBK\'");
就是在你初始化并连接到数据库之后提交的查询语句。
你公司的要求就是读取数据库的内容并显示出来?
如果你之前没用VC写过读写MySQL的程序的话最好看下MySQL的开发文档。下面代码是从我的代码里面找的一部分读写数据库的。

通过C API连接数据库分为初始化、设置选项、连接到数据库3步:

MYSQL mysql; // 数据库句柄
MYSQL *pmysql; // 验证连接用句柄

// 初始化数据库
if (mysql_init(&mysql) == NULL)
{
// 初始化数据库错误
return;
}

// 设置MySQL选项
mysql_options(&m_mysql,MYSQL_READ_DEFAULT_GROUP,"IMServer");

// 连接到数据库
// mysql_real_connect(数据库句柄,主机名,用户名,密码,数据库名,端口,命名管道,客户端标记)
pmysql = mysql_real_connect(&m_mysql,"localhost","root",NULL,"imdb",3306,NULL,0);

// 检测是否连接成功
if (pmysql == &m_mysql)
{
// 连接失败
return;
}

如果连接成功,就可以进行数据库的读写了:
读写方式就跟平常查询数据库一样,返回的结果放在一个结果集变量中。
步骤是:
1.mysql_query()提交查询语句
2.mysql_use_result()获取上一次查询的结果集
3.mysql_fetch_row()从结果集中获取单项内容
4.mysql_free_result()释放结果集

下面的例子查询表imdb_users中UserID为abc的条目:
假设前面已经连接到了数据库,句柄为mysql
///////////////////////

MYSQL_RES *result; // 存放结果集
MYSQL_ROW row; // 存放结果集中单个条目
unsigned long *nLength; // 存放结果字段的长度
char ch_query[100]; // 存放ANSI查询语句

// 查询语句
CString strQuery = L"select * from imdb_users where UserID = \'abc\'";

// 用前面说的封装API的函数将查询语句转换为ANSI
UnicodeToAnsi(ch_query,strQuery);

// 提交查询语句
if(mysql_query(&mysql,ch_query)!=0)
{
// 查询出错,返回
return;
}

// 读取结果集
if(!(result=mysql_use_result(&m_mysql)))
{
// 读取结果集失败
return;
}

// 获取查询到的表的每列的信息
if ((row=mysql_fetch_row(result)) == NULL)
{
// 没有找到数据
mysql_free_result(result); // 释放结果集内存
return
}

// 获取结果字段的长度
nLength = mysql_fetch_lengths(result);

// 获取结果集中第一个字段的内容
WCHAR wsz[100];
MultiByteToWideChar(CP_ACP,0,row[1],nLength[1]+1,wsz,sizeof(wsz));

// 显示内容
CString str;
str.Format(L"%s",wsz);
AfxMessageBox(str);

mysql_free_result(result); // 释放结果集内存

===============================================
我以前也碰到了这个问题。

我看了下之前的代码,但不记得哪些代码是用来解决这个问题了。

大概是先要
mysql_query(&m_mysql,"set names \'GBK\'");
设置查询用的编码,我这用的GBK。

这样返回的结果集的编码跟数据库的编码就一样了。这样一来得到的字符串应该不是问号,而是乱码了。

然后很重要的一点,要根据你程序使用的编码决定是否要转换字符。如果你的程序使用了Unicode,要么就一定要进行转换,我之前搞了半天只获得了第一个字符,后来才觉得是Unicode的问题。因为MySQL返回的字符是单字节,Unicode是双字节,直接显示肯定不匹配。转换是用MultiByteToWideChar()和WideCharToMultiByte()这两个Windows API,前者ANSI > Unicode, 后者Unicode > ANSI。

ANSI > Unicode:

WCHAR ch[200];
MultiByteToWideChar(CP_ACP,0,row[0],nLength[0]+1,ch,sizeof(ch));
===============================================

Unicode > ANSI:
// 将CString的内容转换为ANSI
void DbProcess::UnicodeToAnsi( char *pstr, CString str )
{
WCHAR *pwtrQuery;
pwtrQuery = (WCHAR *)(LPCTSTR)str;
WideCharToMultiByte(CP_ACP,0,pwtrQuery,-1,pstr,strlen(pstr),NULL,NULL);
}

使用方法:
char ch[200];
CString str = L"Unicode charactor";
UnicodeToAnsi(ch, str);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式