【MySQL】Ubuntu下C++连接MySQL
C++连接MySQL
- ubuntu下载MySQL
- 1.构建mysql对象,获得mysql访问句柄
- 2.mysql的连接
- 3.向mysqld下达命令(增删改)
- 3.C_C++查询细节处理
- 3.1 下达查询命令
- 3.2 转储查询结果
- 3.3显示查询结果
- 4.编译链接
ubuntu下载MySQL
sudo apt install libmysqlclient-dev
下载完毕,后就可以从/usr/include/mysql
看到mysql的头文件。
并可以从/usr/lib/x86_64-linux-gnu
看到mysql的动静态库
mysql的库是属于第三方库,gcc/g++默让是连接c/c++的库的,在编译链接时需要手动指定链接的库的位置和名称
1.构建mysql对象,获得mysql访问句柄
mysql对象的创建初始化,在这里进行初始化这个对象的时候这个东西其实就相当于我们学文件当中所对应的那个大写的FILE”,就相当于我们学系统当中对应的文件描述符fd,统一用来标识一部分我们mysql客户端相关的资源.
其中呢,我们把这种东西呢一般可以称之为句柄
//创建mysql句柄,类似文件描述符MYSQL *my =mysql_init(nullptr);if(my==nullptr){std::cerr<<"init error"<<std::endl;return 1;}
2.mysql的连接
mysqld是一个网络服务(底层是tcp),在接受到sql指令执行之前,需要先建立连接。
const std::string host="127.0.0.1";const std::string username="root";const std::string passwd="123456";const std::string db="db";const int port=3306;//连接数据库mysqld,底层是tcp所以使用之前需要连接if(mysql_real_connect(my,host.c_str(),username.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cerr<<"connect error"<<std::endl;}std::cout<<"connect success"<<std::endl;
3.向mysqld下达命令(增删改)
可以通过mysql_query()来对数据库进行操作
//给mysql下达命令 std::string sql="insert into students values(1,22,'男');";int n=mysql_query(my,sql.c_str());if(n==0){std::cout<<"操作成功"<<std::endl;}else{std::cout<<"操作失败"<<std::endl;}
【客户端编码问题】
所有的乱码问题,那么一定是因为客户端和服务器双方对于编码问题没有形成一致
1.建立好链接之后,获取英文没有问题,如果获取中文是乱码,就说明两端的编码不一致
2.设置链接的字符集是utf8,原始默认是latin1
(在mysql5.7的时候,mysqlclient默认编码是latin1,如果插入中文就会乱码,所以链接成功数据库后,需要设置编码,mysql_set_character_set(my, “utf8”);
但是8.0之后,默认是utf8mb4,无需设置)
mysql_set_character_set(my,"utf8");
3.C_C++查询细节处理
在C_C++语言下要想进行数据库的查询select工作,不仅仅是向mysqld下达select命令,还要将查询的结果保存起来,这样才能将结果显示出来。
3.1 下达查询命令
//给mysql下达select命令 std::string sql="select *from students;";int n=mysql_query(my,sql.c_str());if(n==0){std::cout<<"操作成功"<<std::endl;}else{std::cout<<"操作失败"<<std::endl;}
3.2 转储查询结果
//将结果保存起来MYSQL_RES * res =mysql_store_result(my);if(nullptr == res){std::cerr<<"mysql_store_result error"<<std::endl;return 2;}
3.3显示查询结果
//获取二维表的行数和列数int rows=mysql_num_rows(res);int fields=mysql_num_fields(res);std::cout<<"行数:"<<rows<<std::endl;std::cout<<"列数:"<<fields<<std::endl;
//获取二维表的列名MYSQL_FIELD *fields_array=mysql_fetch_fields(res);for(int i=0;i<fields;i++){std::cout<<fields_array[i].name<<"\t";}std::cout<<"\n"<<std::endl;
//获取二维表的内容for(int i=0;i<rows;i++){MYSQL_ROW rowarry=mysql_fetch_row(res);for(int j=0;j<fields;j++){std::cout<<rowarry[j]<<"\t";}std::cout<<"\n";}
4.编译链接
g++ -o mytest test.cpp -L/usr/lib/x86_64-linux-gnu -lmysqlclient