问题背景
跟着网上改了好多配置还是不行,VS2017的MFC往xampp的MySQL数据库插入中文还是会乱码或者变成问号?
我之前的代码是使用char*来存sql语句的。在MFC的界面,我用AfxMessageBox(_T(insert));来查看
sql语句是否在这里出现问题(比如乱码,或者没有传值),但是这里sql语句语法正确并且没有乱码。
然后我又去navicat for mysql 随便写了一句sql插入语句,发现这里插入数据后,中文是可以被显示
的。
MYSQL m_sqlCon;
//初始化数据库对象
mysql_init(&m_sqlCon);
//localhost:服务器地址,可以直接填入IP;root:账号;
//123456:密码;test:数据库名;666:网络端口
if (!mysql_real_connect(&m_sqlCon, "localhost", "root",
"123456", "test", 666, NULL, 0))
{
AfxMessageBox(_T("数据库连接失败!"));
return;
}
else//连接成功则继续访问数据库,之后的相关操作代码基本是放在这里面的
{
AfxMessageBox(_T("数据库连接成功!"));
UpdateData(true);
//设置数据库字符格式,解决中文乱码问题
mysql_query(&m_sqlCon, "set names 'gb2312'");
//mysql_query(&m_sqlCon, "SET NAMES 'GB2312'"); //m_sqlCon是MYSQL类型
//mysql_query(&m_sqlCon, "set names 'utf8'");
char* num = (char*)m_num.GetBuffer();
char* name = (char*)m_name.GetBuffer();
char* age = (char*)m_age.GetBuffer();
//调试num name是否被获取
AfxMessageBox(_T(num));
AfxMessageBox(_T(name));
//创建sql语句
char insert[1000];
mysql_query(&m_sqlCon, "set names 'utf8'");
sprintf_s(insert, "insert into student(num, name, age) values (\'%s\', \'%s\', \'%s\')",
num, name, age);
AfxMessageBox(_T(insert));
// 执行 sql 语句。
if (mysql_query(&m_sqlCon, insert) == 0)
{
AfxMessageBox(_T("插入数据成功!"));
}
else {
AfxMessageBox(_T("插入数据失败!"));
}
}
UpdateData(false);
mysql_close(&m_sqlCon);//关闭Mysql连接
解决办法
换成CString来存数据就可以读取了,往数据库里存储也不会乱码。我现在也不知道问题是啥。网上
看到有一个说法说CString是宽字节,不明所以,先记录一下。
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
//int local_id = m_Add_id;
CString num = m_num;
CString name = m_name;
CString age = m_age;
// 创建 MYSQL 对象。
MYSQL m_sqlCon;
// 初始化 MYSQL 对象。
mysql_init(&m_sqlCon);
// 连接数据库
if (!mysql_real_connect(&m_sqlCon, "localhost", "root",
"123456", "test", 666, NULL, 0))
{
AfxMessageBox(_T("数据库连接失败!"));
}
else
{
AfxMessageBox(_T("数据库连接成功!"));
// 设置字符集, 使程序支持中文。
mysql_query(&m_sqlCon, "set names 'gb2312'");
}
// 创建 SQL 语句字符串
CString sql_insert;
sql_insert.Format("insert into student(num, name, age) values ( \"%s\", \"%s\",\"%s\")",num, name, age);
// 执行 sql 语句。
if (mysql_query(&m_sqlCon, (char*)(LPCTSTR)sql_insert) == 0)
{
AfxMessageBox("插入数据成功!");
}
else
{
AfxMessageBox("插入数据失败!");
}
UpdateData(false);
mysql_close(&m_sqlCon);