mysql connector c++查询数据库问题

mvwan 2019-01-07 01:42:29
mysql字符集:

数据库字符集

表的字符集


使用UTF8编码查询中文字段内容:
1、res->getString("姓名").c_str()读取失败。
2、使用编号res->getString(1).c_str(),显示出来是乱码。
使用gbk编码查询中文字段内容:
1、res->getString("姓名").c_str()读取的是字段中第一个整型字段的内容,比如第一列是varchar“姓名”,第二列是int"年龄"。res->getString("姓名").c_str()读取出来的是字段“年龄”中的内容

2、使用编号res->getString(1).c_str()正常显示中文
应该是字符集的问题,但是修改my.ini中mysql的字符集为utf8还是一样。
各位大神到时该怎么设置。

#pragma once
#include"mysql_connection.h"
#include"mysql_driver.h"
#include"mysql_error.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include<iostream>
using namespace std;

int main()
{
sql::mysql::MySQL_Driver *driver = NULL;
sql::Connection *conn = NULL;
sql::Statement *stmt = NULL;
sql::ResultSet *res = NULL;
try
{
driver = sql::mysql::get_mysql_driver_instance();
conn = driver->connect("tcp://localhost:3306/ygx", "root", "123456");
cout << "连接成功!" << endl;
}
catch (const std::exception&)
{
cout << "连接失败!" << endl;
goto END;
}
try
{
stmt = conn->createStatement();
stmt->execute("set character set gbk");
res = stmt->executeQuery("select * from test");
}
catch (const std::exception&)
{
cout << "查询失败!" << endl;
goto END;
}
cout << "查询成功!" << endl;
try
{
if (res->next())
{
cout << res->getString("姓名").c_str() << endl;
}
}
catch (const std::exception&)
{
cout << "显示失败!" << endl;
goto END;
}
END:
delete res;
delete stmt;
delete conn;

return 0;
}
...全文
396 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mvwan 2019-01-30
  • 打赏
  • 举报
回复
见鬼了,相同的代码今天我又试了一下,提交语句和结果不需要转码,能正常操作了。公司MYSQL是5.5.57,家里的MYSQL是从官网下载的最新的,回去我再试试家里的。
yiyefangzhou24 2019-01-18
  • 打赏
  • 举报
回复
“姓名”和“张三”都要是utf8编码,简而言之,定义一个函数,在sql语句查询之前整体转换成utf8编码
mvwan 2019-01-14
  • 打赏
  • 举报
回复
因为查询的时候,查询语句带中文查询语句出错,设置GBK和UTF8都不行。比如:select * from test where 姓名='张三'
yiyefangzhou24 2019-01-10
  • 打赏
  • 举报
回复
为什么要改cmd的字符集?这个是根据操作系统字符集走的,你程序读取了数据之后进行转换到utf8编码再进行查询不就行了
大苟姬 2019-01-09
  • 打赏
  • 举报
回复
在文件上面加#pragma execution_character_set("utf-8")
mvwan 2019-01-09
  • 打赏
  • 举报
回复
引用 6 楼 chenxiaohui318 的回复:
在文件上面加#pragma execution_character_set("utf-8")
虽然没有解决,但是让我又学到一招,感谢大佬!
mvwan 2019-01-09
  • 打赏
  • 举报
回复
引用 5 楼 yiyefangzhou24 的回复:
res->getString("姓名").c_str(),这个“姓名”两个字首先要转换成utf8编码
厉害了我的锅,转换后就对了,困扰我好多天了,cmd中mysql的字符集我知道显示不正确改怎么处理,c++通过mysql connector c++连接指定字符集总是不对。大佬知道指定字符集来做吗?不需要转换编码。
yiyefangzhou24 2019-01-08
  • 打赏
  • 举报
回复
res->getString("姓名").c_str(),这个“姓名”两个字首先要转换成utf8编码
mvwan 2019-01-08
  • 打赏
  • 举报
回复
用的连接方式不一样吧,我的头文件是没有mysql.h的,改成UTF8后发送查询语句就崩溃了。
@风轻云淡_ 2019-01-07
  • 打赏
  • 举报
回复
stmt->execute("set character set gbk");
上面这条语句里设置的是 访问服务端时需要使用的编码方式,你的服务端使用的是utf8,你把这里改成utf8试试。下面是我测试用的代码:
#include <iostream>
#include "mysql.h"

using namespace std;

int main()
{
MYSQL conn;
int res;
mysql_init(&conn);
if(mysql_real_connect(&conn,"localhost","root","","tboy",0,NULL,CLIENT_FOUND_ROWS))
{
res = mysql_query(&conn, "set names utf8");
// res = mysql_query(&conn,"insert into test values('today','编码测试语句,无乱码即为测试成功')");
res = mysql_query(&conn,"select * from test");
if(res)
{
cout << "error,res:" << res << endl;
}
else
{
MYSQL_RES *result = mysql_store_result(&conn);
if (result)
{
int num_fields = mysql_num_fields(result);
int num_rows=mysql_num_rows(result);
for(int i=0;i<num_rows;i++)
{
MYSQL_ROW row=mysql_fetch_row(result);
if(row<0) break;
for(int j=0;j<num_fields;j++)
{
cout<<row[j]<<"\t";
}
cout<<endl;
}
}
}
mysql_close(&conn);
mysql_library_end();
}
else
cout << "connect error!" << endl;
return 0;
}

插入、查询都是没有问题的。下面是编码设置:
mvwan 2019-01-07
  • 打赏
  • 举报
回复
MySQL Connector / C ++ https://dev.mysql.com/downloads/connector/cpp/
JoeBlackzqq 2019-01-07
  • 打赏
  • 举报
回复
兄弟,你用的是什么mysql库呀,头文件这么特别!

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧