MySQL访问就是可以让我们不通过命令行的方式去防蚊数据库 可以使用我们平常使用的语言去访问数据库
要做到这一点需要配置环境 要么去官网下载第三方库 要么安装yum或者apt源它自带有需要的开发环境
查看进行MySQL访问的头文件以及库函数 我们在程序中使用的就是这些库函数实现数据库访问 这些库函数也有自己的头文件

环境配置成功之后可以开始进行访问了 首先来验证一下环境是不是好的 先在Linux环境下连接云服务器新建一个test.cc 在这里面来调用mysql头文件中的一个库函数

编译链接 
找不到库函数 这是因为不知道去默认路径中找那个库 所以要指明 -lmysqlclient 来告诉程序链接哪一个库
至于头文件这里不需要 因为程序中已经包含了<mysql/mysql.h>而这个头文件本身就在查找头文件的默认路径里面 所以不需要手动指明头文件路径

现在验证了可以正常访问数据库 接下来开始使用C++来对库中的表进行增删查改操作
首先新建一个MySQL普通用户connector 之后在root下新建一个数据库conn在conn里面新建一张表user 并且将对conn的user的所有权限赋予这个connector
先要创建一个类似于FILE*的句柄 并且初始化 下面每一个参数对应的就是在mysql中创建的一系列东西 最后两个参数不管
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
接下来用C++调用mysql库函数对connector下的conn数据库中的user表进行操作
cpp
#include <iostream>
#include <string>
#include <mysql/mysql.h> // 系统默认识别这个二级路径
const std::string host = "localhost";
const std::string user = "connector";
const std::string passwd = "12345678";
const std::string db = "conn";
const unsigned int port = 3306;
int main()
{
// std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
MYSQL* my = mysql_init(nullptr);
if (my == nullptr)
{
std::cerr << "mysql init error" << std::endl;
return 1;
}
if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
std::cerr << "mysql connect error" << std::endl;
return 2;
}
std::string sql;
while (true)
{
std::cout << "MySql>>> ";
if (!std::getline(std::cin, sql) || sql == "quit")
{
std::cout << "Bye" << std::endl;
break;
}
int n = mysql_query(my, sql.c_str());
if (n == 0)
{
std::cout << "success:" << n << std::endl;
}
else
{
std::cout << "failed:" << n << std::endl;
}
}
mysql_close(my);
return 0;
}


正常访问
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8")
有一个需要关注的点 就是select能不呢正常访问 
success 但是没有显示查找的数据 这是因为select相对于增删改更加复杂 这三种只需要对数据修改即可 没有后续 而select还有后续
那么如何查看select之后的结果呢 这需要使用相关接口
MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。
获取结果行数mysql_num_rows my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取结果列数mysql_num_fields unsigned int mysql_num_fields(MYSQL_RES *res);
获取列名mysql_fetch_fields MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

res就相当于一个char**地二维数组 里面存放了select地一些数据 我们可以通过特定的接口来访问这些数据而不需要自己手动操作指针
看代码和操作结果
cpp
int main()
{
MYSQL* my = mysql_init(nullptr);
if (my == nullptr)
{
std::cerr << "mysql init error" << std::endl;
return 1;
}
if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
std::cerr << "mysql connect error" << std::endl;
return 2;
}
// 输入语句
std::string sql = "select * from user";
int n = mysql_query(my, sql.c_str());
if (n == 0)
{
std::cout << "success" << std::endl;
}
else
{
std::cerr << "failed" << std::endl;
return 3;
}
// 获取select的转储集
MYSQL_RES* res = mysql_store_result(my);
if (nullptr == res)
{
std::cerr << "mysql_store_result error" << std::endl;
return 4;
}
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 << std::endl;
// 获取内容
for (int i = 0; i < rows; i++)
{
MYSQL_ROW row = mysql_fetch_row(res);
for (int j = 0; j < fields; j++)
{
std::cout << row[j] << "\t";
}
std::cout << std::endl;
}
mysql_free_result(res);
mysql_close(my);
return 0;
}
