c++ mysql 写库 乱码 ??_C++ 读写 mysql 数据库中文乱码

最近在读写mysql数据库时,碰到乱码的问题,研究一番发现vs项目下,默认编码Unicode,但我的数据库默认utf8,所以读取数据的时候中文乱码。最终通过以下方法解决:

1、写入数据库时设置编码为gbk

mysql_query(connect, "set names gbk")

2、读取数据库时设置编码为utf8

mysql_query(connect, "set names utf8")

3、读取时将utf8转为unicode

wchar_t* Utf8_2_Unicode(char* row_i)

{

int len = MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), NULL, 0);

wchar_t *wszStr = new wchar_t[len + 1];

MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), wszStr, len);

wszStr[len] = '\0';

return wszStr;

}

结果对比:

e48ad05e5961b5f055b0226ca47c91df.png        2ee0462cc7e035996f6870641e1b29b0.png

数据库:

6f6ff3d5f123eaf6b665233d64f26eb6.png

code:

#include "mysql/mysql.h"

#include #include #include using namespace std;

wchar_t* Utf8_2_Unicode(char* row_i)

{

int len = MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), NULL, 0);

wchar_t *wszStr = new wchar_t[len + 1];

MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), wszStr, len);

wszStr[len] = '\0';

return wszStr;

}

int main()

{

//初始化MYSQL

MYSQL *connect = mysql_init((MYSQL*) 0);;

//连接到MYSQL

connect = mysql_real_connect(connect, "localhost", "root", "123", "test", 3306, NULL, 0);

if (connect == NULL)

{

return mysql_errno(connect);

}

//将编码设置为gbk

if (mysql_query(connect, "set names gbk"))

{

return mysql_errno(connect);

}

//写入中文数据

if (mysql_query(connect, "INSERT INTO country(序号,中文,英文) VALUES('3','美国','America')"))

{

return mysql_errno(connect);

}

//设置编码格式utf8

int ret = mysql_query(connect, "set names utf8");

//读取中文数据

ret = mysql_query(connect, "SELECT * FROM country");

if (ret)

{

return mysql_errno(connect);

}

else

{

//获取结果集

MYSQL_RES *res = mysql_store_result(connect);

MYSQL_ROW row;

while (row = mysql_fetch_row(res))

{

//将字符由utf8专转为unicode

wchar_t* m1 = Utf8_2_Unicode(row[2]);

wchar_t* m2 = Utf8_2_Unicode(row[1]);

MessageBox(NULL, m1, m2, NULL);

}

mysql_free_result(res);

}

mysql_close(connect);

getchar();

return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值