- **必要性:**C 语言本身无内置 MySQL 交互功能,需依赖 MySQL 官方提供的客户端库(MySQL Connector/C)实现与 MySQL 服务器的通信,包括连接建立、SQL 执行、结果处理等核心操作。
- **官方支持:**MySQL Connector/C 是 MySQL 官方推出的 C 语言接口库,专为 C 程序与 MySQL 服务器交互设计,确保兼容性和稳定性,适配各版本 MySQL 服务器。
- **平台适配:**需根据开发 / 运行平台(Linux、Windows、macOS 等)及系统位数(32/64 位)选择对应版本,避免因平台差异导致链接或运行错误。
- **前置依赖:**使用前需确保 MySQL 服务正常运行(本地或远程可访问),否则库文件无法建立有效连接。
1.Connector/C 使用
1.1 准备工作
若要在CentOS系Linux系统中装MySQL社区版服务器,可使用以下命令;而MySQL Connect则是后续让应用连接该服务器的工具。
bash
yum install -y mysql-community-server
一般情况下,我们下载MySQL时会包含开发库和头文件。如果没有,接下输入一下命令来安装开发库和头文件(C 语言连接 MySQL 必需的 mysql.h 等文件):
bash
yum install -y mysql-community-devel
安装后可在/usr/include/mysql目录下查看是否安装好:
bash
[root@VM-4-6-centos ~]# ls /usr/include/mysql -d
/usr/include/mysql #说明已经安装好
查看mysql的动态库和静态库(mysql的动态库和静态库帮助我们连接mysql):
sql
[root@VM-4-6-centos ~]# ls /lib64/mysql/*
/lib64/mysql/libmysqlclient.a /lib64/mysql/libmysqlclient.so.20.3.31
/lib64/mysql/libmysqlclient.so /lib64/mysql/libmysqlservices.a
/lib64/mysql/libmysqlclient.so.20
/lib64/mysql/mecab:
dic etc
/lib64/mysql/plugin:
adt_null.so ha_example.so locking_service.so semisync_master.so
authentication_ldap_sasl_client.so innodb_engine.so mypluglib.so semisync_slave.so
auth_socket.so keyring_file.so mysql_no_login.so validate_password.so
connection_control.so keyring_udf.so mysqlx.so version_token.so
debug libmemcached.so rewrite_example.so
group_replication.so libpluginmecab.so rewriter.so
1.2 验证引入是否成功
测试代码:
cpp
#include <iostream>
#include <mysql/mysql.h> //如果不带/mysql路径,编译时需要带-I/usr/include/mysql,指定编译器搜索头文件的路径
using namespace std;
int main()
{
cout << "mysql client version: " << mysql_get_client_info() << endl;
return 0;
}
接下来编译,由于系统默认搜索路径中没有第三方库(如MySQL的libmysqlclient),`-L`指定其存放路径,`-l`指定要链接的库名,以此才能让编译器找到并使用该库。
bash
g++ test.cc -o test -L/lib64/mysql -lmysqlclient
运行结果如果是mysql的版本号,那么就没问题。
bash
[lin@VM-4-6-centos test_db]$ ./test
mysql client version: 5.7.44
2.mysql接口介绍
2.1 官方文档的使用
选择DOCUMENTATION页面

2.2 初始化接口
要使用库,必须先进行初始化!
cpp
MYSQL *mysql_init(MYSQL *mysql);
- MYSQL *mysql:指向 MYSQL 结构体的指针(需先通过 mysql_init() 初始化),用于存储连接相关的状态和信息,是函数操作的核心对象。
2.3 链接数据库
初始化完毕之后,必须先链接数据库再进行后续操作。(mysql网络部分是基于TCP/IP的)
cpp
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 client_flag);
参数:
- host:要连接的主机。
- user:要连接的用户名。
- passwd:对应用户的密码。
- db:连接后默认使用的数据库名。
- port:mysql服务器的端口号(可从/etc/my.cnf查看)。
- unix_socket:指定用于本地连接的 Unix 套接字文件路径(如 /tmp/mysql.sock);NULL 表示使用默认套接字路径。
- clientflag:连接选项标志,用于设置特殊连接行为,常用值0表示默认值(无特殊选项)。
返回值:
- 连接成功:返回与第一个参数(初始化后的 mysql 指针)相同的非 NULL 指针,可用于后续数据库操作。
- 连接失败:返回 NULL 。
注意事项:建立好链接后,获取英文没有问题。但是如果获取中文会是乱码。设置链接的默认字符集是utf8,原始默认是latin1。所以需要调用mysql_set_character_set(myfd,"utf8");
2.4 查询数据
cpp
int mysql_query(MYSQL *mysql,const char *stmt_str);
参数:
- mysql:上面已经介绍过。
- stmt_str:要执行的sql语句,如"select * from table"。
返回值:
- 0:SQL 语句执行成功(注意:成功不代表查询有结果,仅表示语句语法和执行过程无错误)。
- 非 0:SQL 语句执行失败(如语法错误、表不存在、权限不足等),需通过 mysql_error() 查看具体失败原因。
2.5 读取数据
cpp
MYSQL_RES *mysql_store_result(MYSQL *mysql);
在 MySQL 客户端编程中,mysql_store_result 函数是处理查询结果的关键函数。该函数会通过调用 MYSQL 变量中 st_mysql_methods 结构体的 read_rows 函数指针,从服务器获取查询结果,并将这些结果封装到 MYSQL_RES 类型的变量中返回。
MYSQL_RES 作为专门用于保存查询结果的结构体,其内部存储了查询返回的完整数据。在函数执行过程中,mysql_store_result 会通过 malloc 动态分配一片内存空间,用于存储从服务器读取的所有数据 ------ 值得注意的是,MySQL 会将查询结果中表格的所有内容都以字符串形式读取,再由 mysql_store_result 对这些字符串数据进行归置整理,形成结构化的结果集。
正因为该函数涉及动态内存分配,所以在使用完 MYSQL_RES 类型的结果变量后,必须调用相应的释放函数(如 mysql_free_result)来释放其占用的内存。若忘记执行 free (result) 操作,会直接导致内存泄漏,这一点在编程中需要特别注意。而在调用 mysql_store_result 之后,后续的结果处理 API(如获取字段数、读取行数据等)本质上都是对 MYSQL_RES 中已存储的数据进行读取和解析。
2.6 获取结果行数
cpp
my_ulonglong mysql_num_rows(MYSQL_RES *res);
2.7 获取结果列数
sql
unsigned int mysql_num_fields(MYSQL_RES *res);
2.8 获取列名
sql
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
2.9 获取结果内容
sql
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **(可以当成一个二维数组来用)。
2.10 释放结果集
sql
void mysql_free_result(MYSQL_RES result);
2.11 关闭接口
cpp
void mysql_close(MYSQL *mysql);
