MySQL————mysql connect

  1. **必要性:**C 语言本身无内置 MySQL 交互功能,需依赖 MySQL 官方提供的客户端库(MySQL Connector/C)实现与 MySQL 服务器的通信,包括连接建立、SQL 执行、结果处理等核心操作。
  2. **官方支持:**MySQL Connector/C 是 MySQL 官方推出的 C 语言接口库,专为 C 程序与 MySQL 服务器交互设计,确保兼容性和稳定性,适配各版本 MySQL 服务器。
  3. **平台适配:**需根据开发 / 运行平台(Linux、Windows、macOS 等)及系统位数(32/64 位)选择对应版本,避免因平台差异导致链接或运行错误。
  4. **前置依赖:**使用前需确保 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 官方文档的使用

MySQL

选择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);
相关推荐
AI浩3 小时前
MFFCI-YOLOv8:一种基于多尺度特征融合与上下文信息的轻量级遥感目标检测网络
1024程序员节
mit6.8243 小时前
[OP-Agent] 可扩展架构 | 插件管理器plugins.go
go·1024程序员节
cai_huaer3 小时前
BugKu Web渗透之 文件包含2
web安全·1024程序员节
蓝天居士3 小时前
PY32F040单片机介绍(1)
单片机·国产mcu·1024程序员节
ʚ希希ɞ ྀ3 小时前
初学JVM---什么是JVM
1024程序员节
2401_888859714 小时前
STM32_bug总结-运行函数在SystemInit之后就卡死
1024程序员节
G佳伟4 小时前
PHP拆分重组pdf,php拆分pdf指定页数,并合并成新pdf
1024程序员节
NewsMash4 小时前
益品康丰集团:以科技重塑康养未来,让健康触手可及
1024程序员节
xixixi777774 小时前
怎么区分主动攻击和被动攻击啊,为什么跨站脚本是被动攻击?
xss·1024程序员节·跨站脚本·主动攻击·被动攻击