【MySQL】MySQL C API 访问 MySQL

【MySQL】MySQL C API 访问 MySQL
目录引入库和头文件接口介绍mysql_init - 初始化mysql_real_connect - 连接mysql_set_character_set - 设置字符集mysql_query - 发送指令获取查询结果结果转储获取行数和列数获取列属性获取结果内容释放查询结果mysql_close - 关闭引入库和头文件yum install mysql-devel接口介绍mysql_init - 初始化要使用库必须先进行初始化函数原型MYSQL *mysql_init(MYSQL *mysql)返回值 MYSQL* 是结构体指针。MYSQL 结构体包含连接的 MySQL 的属性类似于 FLIE*使用示例MYSQL *my mysql_init(NULL); if(my nullptr) { std::cerr init mysql error std::endl; return 1; }mysql_real_connect - 连接函数原型和参数含义MYSQL *mysql_real_connect( MYSQL *mysql, // 已初始化的连接句柄 const char *host, // 主机名或IP地址 const char *user, // 用户名 const char *passwd, // 密码 const char *db, // 要连接的数据库名 unsigned int port, // 端口号0表示默认(3306) const char *unix_socket, // Unix socket或命名管道通常为NULL unsigned long client_flag // 客户端标志通常为0 ); //连接成功时函数会返回与第一个参数相同的 MYSQL* 指针如果失败则返回 NULL此时可以通过 //mysql_error() 获取具体的错误信息各参数细节如下mysql一个由mysql_init(NULL)初始化得到的连接句柄所有后续操作都依赖于它。host要连接的 MySQL 服务器地址。传NULL或localhost表示连接本机。在 Unix/Linux 下会优先使用 socket 文件在 Windows 下会尝试使用共享内存或命名管道。传 IP 地址或域名则会使用 TCP/IP 协议进行连接。user和passwd登录凭证。密码不需要在外部提前加密mysql_real_connect会自动处理。如果passwd传NULL客户端会尝试进行无密码登录仅当该用户允许空密码时才能成功。db想要连接的默认数据库名。如果传NULL连接成功后需要手动调用mysql_select_db()来选择数据库。portMySQL 服务器的端口号。传入0表示使用默认端口3306。unix_socket在 Unix/Linux 下可通过此参数指定 socket 文件的路径。通常情况下传入NULL即可。client_flag用于开启特定功能比如启用压缩传输(CLIENT_COMPRESS)或支持多语句执行(CLIENT_MULTI_STATEMENTS)。大部分情况下传入0即可满足基本需求。mysql_set_character_set - 设置字符集//建立好链接之后获取英文没有问题如果获取中文是乱码 //设置链接的默认字符集是utf8原始默认是latin1 mysql_set_character_set(myfd, utf8);mysql_query - 发送指令函数原型int mysql_query(MYSQL *mysql, const char *q);第一个参数上面已经介绍过第二个参数为要执行的 sql 语句,如“select * from table”。获取查询结果结果转储sql执行完以后如果是查询语句我们当然还要读取数据如果updateinsert等语句那么就看下操 作成功与否即可。我们来看看如何获取查询结果 如果mysql_query返回成功那么我们就通过 mysql_store_result这个函数来读取结果函数原型MYSQL_RES *mysql_store_result(MYSQL *mysql);select 的查询结果就保存在 MYSQL 结构体中该函数的作用就是将保存在 MYSQL 结构体中的查询结果复制到 MYSQL_RES 结构体中。使用示例std::string sql select * from user; int n mysql_query(my, sql.c_str()); if(n 0) std::cout sql success std::endl; else { std::cerr sql failed std::endl; return 3; } MYSQL_RES *res mysql_store_result(my); if(nullptr res) { std::cerr mysql_store_result error std::end1; return 4; }获取行数和列数获取结果行数my_ulonglong mysql_num_rows(MYSQL_RES *res);获取结果列数unsigned int mysql_num_fields(MYSQL_RES *res);获取列属性MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);该函数会返回一个结构体数组指针每个元素的类型是 MYSQL_FIELD 结构体该结构体保存了 列的各种属性比如列名、列的数据类型、所在的数据库名等等。使用示例int fields mysql_num_fields(res); MYSQL_FIELD *field mysql_fetch_fields(res); for(int i 0; i fields; i) { cout field[i].name ; } coutendl;获取结果内容MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);每次调用会返回一个 MYSQL_ROW 指针其实就是 char** 类型的指针它指向结果的某一列。每次调用mysql_fetch_row 会自动指向下一行下次调用就返回指向下一行的 char** 类型的指针使用示例MYSQL_ROW line; for(int i 0; i nums; i)// nums 是之前获取的行数 { line mysql_fetch_row(res); for(int j 0; j fields; j) // fields 是之前获取的列数 { cout line[j] \t; } cout endl; }释放查询结果select 的查询结果是保存在 MYSQL_RES 结构体中的而MYSQL_RES 结构体是申请的堆空间因此如果不再使用就要释放空间。函数原型void mysql_free_result(MYSQL_RES *result);注意result 必须是经过 mysql_store_result 返回的指针也就是说必须是指向开辟了空间的MYSQL_RES结构体。mysql_close - 关闭使用完后要关闭类似于 fclose 。函数原型void mysql_close(MYSQL *sock);使用示例mysql_close(my);