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);
相关推荐
学传打活5 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活11 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16818 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心21 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055271 个月前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055271 个月前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝1 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055271 个月前
Java图像处理实战指南
人工智能·1024程序员节
u0103055271 个月前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节