VS2017/Xampp/MySQL/MFC 问题:xampp中向mysql数据库插入中文都变成了问号?或者乱码

问题背景
跟着网上改了好多配置还是不行,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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值