当前位置: 首页 > news >正文

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则是后续让应用连接该服务器的工具。

yum install -y mysql-community-server

一般情况下,我们下载MySQL时会包含开发库和头文件。如果没有,接下输入一下命令来安装开发库和头文件(C 语言连接 MySQL 必需的 mysql.h 等文件):

yum install -y mysql-community-devel

安装后可在/usr/include/mysql目录下查看是否安装好:

[root@VM-4-6-centos ~]# ls /usr/include/mysql -d
/usr/include/mysql #说明已经安装好

查看mysql的动态库和静态库(mysql的动态库和静态库帮助我们连接mysql):

[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 验证引入是否成功

测试代码:

#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`指定要链接的库名,以此才能让编译器找到并使用该库。

g++ test.cc -o test -L/lib64/mysql -lmysqlclient

运行结果如果是mysql的版本号,那么就没问题。

[lin@VM-4-6-centos test_db]$ ./test
mysql client version: 5.7.44

2.mysql接口介绍

2.1 官方文档的使用

MySQL

选择DOCUMENTATION页面

2.2 初始化接口

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

MYSQL *mysql_init(MYSQL *mysql);
  • MYSQL *mysql:指向 MYSQL 结构体的指针(需先通过 mysql_init() 初始化),用于存储连接相关的状态和信息,是函数操作的核心对象。

 2.3 链接数据库

初始化完毕之后,必须先链接数据库再进行后续操作。(mysql网络部分是基于TCP/IP的)

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 查询数据

int mysql_query(MYSQL *mysql,const char *stmt_str);

参数:

  • mysql:上面已经介绍过。
  • stmt_str:要执行的sql语句,如“select * from table”。

返回值:

  • 0:SQL 语句执行成功(注意:成功不代表查询有结果,仅表示语句语法和执行过程无错误)。
  • ​非 0:SQL 语句执行失败(如语法错误、表不存在、权限不足等),需通过  mysql_error()  查看具体失败原因。

2.5 读取数据

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 获取结果行数

my_ulonglong mysql_num_rows(MYSQL_RES *res);

2.7 获取结果列数

unsigned int mysql_num_fields(MYSQL_RES *res);

2.8 获取列名

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

2.9 获取结果内容

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **(可以当成一个二维数组来用)。

2.10 释放结果集

void mysql_free_result(MYSQL_RES result);

2.11 关闭接口

void mysql_close(MYSQL *mysql);
http://www.dtcms.com/a/528628.html

相关文章:

  • 能打开各种网站的搜索引擎原神网页设计作业
  • 【SpringCloud】Ribbon(LoadBalancer ) 和 Feign
  • Dockerfile 中 ENTRYPOINT 和 CMD 有什么区别 ?
  • 网站数据库模版深圳网站建设黄浦网络 骗钱
  • vs code 下docker使用方法,以php 项目为示例
  • 番禺网站建设哪里好深圳十大传媒公司
  • 前端常见的设计模式
  • 亚马逊云渠道商:如何通过配置自动替换构建故障自愈的云架构?
  • 豆包 Python 和 Java 的 AI 集成及模型转换
  • 深入解析C++命令模式:设计原理与实际应用
  • 商城网站建设目标上海前十名文化传媒公司
  • ExpressionVisitor 的使用场景及方法
  • 《3D端游开放世界动态天气系统与场景交互优化实践日志》
  • Date类自主实现后的反思
  • 网络渗流:爆炸渗流
  • 购物网站建设款流程国外优秀设计网站大全
  • 【C++】STL容器-stack和queue的使用与模拟实现
  • numpy学习笔记(持续更新)
  • linux schedule函数学习
  • 教育培训网站有哪些辽宁网站建设企业定制公司
  • Python机器学习---6.集成学习与随机森林
  • 厦门网站建设公司新能源汽车价格表图片及价格表
  • 二分查找栈堆动态规划
  • 【脚本】提取phpstudy网站对应的PHP版本
  • 沈阳做平板网站移动互联网开发是干什么的
  • StreamX部署详细步骤
  • java 正则表达式 所有的优先级
  • 做pc端网站平台网站做游戏活动
  • 【开发者导航】全自动 AI 视频创作与发布工具:LuoGen-agent
  • 网站 空间地址是什么苏州网站制作公司