【MySQL】MySQL C API 访问 MySQL

目录

引入库和头文件

接口介绍

[mysql_init - 初始化](#mysql_init - 初始化)

[mysql_real_connect - 连接](#mysql_real_connect - 连接)

[mysql_set_character_set - 设置字符集](#mysql_set_character_set - 设置字符集)

[mysql_query - 发送指令](#mysql_query - 发送指令)

获取查询结果

结果转储

获取行数和列数

获取列属性

获取结果内容

释放查询结果

[mysql_close - 关闭](#mysql_close - 关闭)


引入库和头文件

bash 复制代码
yum install mysql-devel

接口介绍

mysql_init - 初始化

要使用库,必须先进行初始化

函数原型

bash 复制代码
MYSQL *mysql_init(MYSQL *mysql)

返回值 MYSQL* 是结构体指针。MYSQL 结构体包含连接的 MySQL 的属性,类似于 FLIE*

使用示例

bash 复制代码
MYSQL *my = mysql_init(NULL);
if(my == nullptr)
{
    std::cerr << "init mysql error" << std::endl;
    return 1;
}

mysql_real_connect - 连接

函数原型和参数含义

bash 复制代码
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 协议进行连接。

  • userpasswd :登录凭证。密码不需要在外部提前加密,mysql_real_connect 会自动处理。

    • 如果 passwdNULL,客户端会尝试进行无密码登录(仅当该用户允许空密码时才能成功)。
  • db :想要连接的默认数据库名。如果传 NULL,连接成功后需要手动调用 mysql_select_db() 来选择数据库。

  • port :MySQL 服务器的端口号。传入 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 - 发送指令

函数原型

bash 复制代码
int mysql_query(MYSQL *mysql, const char *q);

第一个参数上面已经介绍过,第二个参数为要执行的 sql 语句,如"select * from table"。

获取查询结果

结果转储

sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操 作成功与否即可。我们来看看如何获取查询结果: 如果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 <<" ";
}
cout<<endl;

获取结果内容

复制代码
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 。

函数原型

bash 复制代码
void mysql_close(MYSQL *sock);

使用示例

bash 复制代码
mysql_close(my);
相关推荐
l1t1 小时前
DeepSeek总结的RegreSQL 2.0测试通过了。计划却没通过。
linux·数据库·postgresql
Dawn-bit2 小时前
Linux打包压缩与用户权限管理详解
linux·服务器·数据库
ls_elect2 小时前
PostgreSQL 18.4 SCRAM-SHA-256 认证故障诊断及修复办法
linux·数据库·postgresql
熊文豪2 小时前
给国产数据库装上中文搜索引擎:zhparser vs jieba 分词实战,与三个隐藏关卡
数据库·搜索引擎·电科金仓
狂师2 小时前
测试人员必备:推荐一款智能测试数据清理AI Skill,支持db、redis、mq等
数据库·aigc·测试
L1624762 小时前
Zabbix 7.0 LTS 完整部署与运维手册(AlmaLinux 9 + MySQL 8.0 + Nginx)
运维·mysql·zabbix
疯狂打码的少年2 小时前
【软件工程】需求工程:需求获取与需求分析
数据库·笔记·软件工程·需求分析
Database_Cool_2 小时前
阿里云 PolarDB-X vs TiDB 分布式数据库选型指南
数据库·分布式·阿里云·tidb
数据库小学妹2 小时前
分布式数据库架构怎么选?三种路线对比+迁移避坑指南
数据库·分布式·分布式数据库·数据库架构·数据迁移·数据库选型