上学期用QT和VS写了一个图书管理系统的大作业,本学期要求用C++写一个电商平台,于是我重操旧业又开始搞起QT+VS,由于这次老师没限制数据库的使用,本着探索求知的精神,我开始了我的踩坑之旅。
第一大敌的就是中文编码问题,回想起上学期的惨痛经历,我决定把QT,C++,MySQL三者之间的中文编码问题整理一下。由于水平有限,只整理做法,不阐述原理,因为我也是一知半解,就不误人子弟
QString qstr = QString::fromWCharArray(L"我是中国人");
string str = QString::fromWCharArray(L"我是中国人").toStdString();
//nameLine 为QLineEdit类型
QString qstr = nameLine.text();
string str = nameLine.text().toStdString();
首先初始化数据库和数据结构
#include
MYSQL my_sqldata;
if (0 == mysql_library_init(0, NULL, NULL)) {
cout << "mysql_library_init() succeed" << endl;
}
else {
cout << "mysql_library_init() failed" << endl;
}
if (NULL != mysql_init(&my_sqldata)) {
cout << "mysql_init() succeed" << endl;
}
else {
cout << "mysql_init() failed" << endl;
}
重点来啦,需要在连接数据库之前进行预设字符集
if (0 == mysql_options(&my_sqldata, MYSQL_SET_CHARSET_NAME,
"gbk"))
{
cout << "mysql_options() succeed" << endl;
}
else
{
cout << "mysql_options() failed" << endl;
}
之后利用mysql_real_connect() 函数连接数据库这里省略,下面写入数据库
string sqlstr =//这里的MySQL语句请自行修改数据表名和表项
"INSERT INTO banks(name) VALUES (\"中国建设银行\");";
if (0 == mysql_query(&my_sqldata, sqlstr.c_str())) {
cout << "mysql_query() insert data succeed" << endl;
}
else {
cout << "mysql_query() insert data failed" << endl;
mysql_close(&my_sqldata);
}
写入后,读取并在C++命令行打印
if (0 == mysql_query(&my_sqldata, sqlstr.c_str()))
{
cout << "mysql_query() select data succeed" << endl;
//一次性取得数据集
MYSQL_RES *result = mysql_store_result(&my_sqldata);
//获取行数
int row_count = mysql_num_rows(result);
//获取各行信息
MYSQL_ROW row = NULL;
row = mysql_fetch_row(result);
while (NULL != row)
{
cout << row[0] << endl;//本例中只有一个表项
row = mysql_fetch_row(result);
}
}
else {
cout << "mysql_query() select data failed" << endl;
mysql_close(&my_sqldata);
}
运行代码后,结果展示,感人的中文!!!
我们知道QT有自己的方法与MySQL建立连接,但由于我只是把QT当做了图形化工具使用,因此这里所谓的QT与MySQL之间的中文编码是以C++为媒介的
我们首先做个实验,按照上面的步骤将C++从MySQL中获取的中文转换为QString输出到用户界面上
QComboBox *bank_combobox = new QComboBox;//建立一个选择银行的复选框
vector<string> banks = getBanks(my_sqldata);//从数据库获取银行名称
for (int count =0;countstd::cout << banks[count]<insertItem(count,
QString::fromStdString(banks[count]));
}
我们忧伤的发现了乱码
肿么办?我们只需要回到预设字符集处,将使用的编码改为UTF8
if (0 == mysql_options(&my_sqldata, MYSQL_SET_CHARSET_NAME,
"UTF8"))
{
cout << "mysql_options() succeed" << endl;
}
else
{
cout << "mysql_options() failed" << endl;
}
感人的事情发生了!
1.对于连接了MySQL之后的两种情况,既然改变了编码方式,可想而知,黑框界面和图形界面的中文是“势不两立”的,这也是这种简单方法的bug所在
2.我也是小白一个,更是第一次写博客,在解决问题的过程中经过多方搜索尝试,整理出来这套方法,所以文中多数代码是直接修改了查到的资料中的代码拿过来用的
3.主要参考:VS2015连接mySQL数据库