欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 【MySQL】使用C语言链接

【MySQL】使用C语言链接

2025/2/25 1:36:00 来源:https://blog.csdn.net/weixin_50776420/article/details/145124247  浏览:    关键词:【MySQL】使用C语言链接

🌈 个人主页:Zfox_
🔥 系列专栏:MySQL

目录

  • 一:🔥 MySQL connect
    • 🦋 Connector / C 使用
    • 🦋 mysql 接口介绍
    • 🦋 完整代码样例
  • 二:🔥 共勉

一:🔥 MySQL connect

📚 MySQL 的基础,我们之前已经学过,后面我们只关心使用
要使用 C 语言连接 MySQL,需要使用 MySQL 官网提供的库,大家可以去官网下载
我们使用 C接口库来进行连接
要正确使用,我们需要做一些准备工作:

  • 保证 mysql 服务有效
  • 在官网上下载合适自己平台的 MySQL connect 库,以备后用
  • 建议直接使用命令 sudo yum install -y mysql-community-server 安装

🦋 Connector / C 使用

  • 📚 我们下下来的库格式如下:
# tree /usr/include/mysql
/usr/include/mysql
├── client_plugin.h
├── errmsg.h
├── field_types.h
├── my_command.h
├── my_compress.h
├── my_list.h
├── mysql_com.h
├── mysqld_error.h
├── mysql.h
├── mysql_time.h
├── mysql_version.h
├── mysqlx_ername.h
├── mysqlx_error.h
├── mysqlx_version.h
├── plugin_auth_common.h
└── udf_registration_types.hlib
# find /usr -name "libmysqlclient*"
/usr/share/doc/libmysqlclient21
/usr/share/doc/libmysqlclient-dev
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40
/usr/lib/x86_64-linux-gnu/libmysqlclient.a
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21

📚 其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)

尝试链接 mysql client

通过 mysql_get_client_info() 函数,来验证我们的引入是否成功

#include <iostream>
#include <mysql/mysql.h>int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;return 0;
} $ g++ -o mytest test.cc -std=c++11 -lmysqlclient
$ ls
Makefile  mytest  test.cc$ ./mytest 
mysql client version: 8.0.40

至此引入库的工作已经做完,接下来就是熟悉接口

🦋 mysql 接口介绍

🦁 MySQL官方文档借口介绍

在这里插入图片描述

  • 初始化 mysql_init()

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

初始化一个 MYSQL对象 
MYSQL *mysql_init(MYSQL *mysql);使用 mysql_init函数初始化一个 MySQL 连接句柄,为后续操作做准备。
如: MYSQL *mfp = mysql_init(NULL)
  • 链接数据库 mysql_real_connect

📚 初始化完毕之后,必须先链接数据库,在进行后续操作。(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 clientflag);//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

第一个参数 MYSQL是 C api 中一个非常重要的对象(mysql_init的返回值),里面内存非常丰富,有
port, dbname, charset 等连接基本参数。它也包含了一个叫 st_mysql_methods 的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
mysql_real_connect 函数中各参数,基本都是顾名思意。

📚 测试:

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "init MySQL error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}std::cout << "connect success" << std::endl;mysql_set_character_set(my, "utf8");    // 设置字符集mysql_close(my);return 0;
}

📚 结果:

# ./mytest 
mysql client version: 8.0.40
connect success

下发 mysql 命令 mysql_query

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

第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”。
获取执行结果 mysql_store_result sql 执行完以后,如果是查询语句,我们当然还要读取数据,如果 update,insert 等语句,那么就看下操作成功与否即可。

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "init MySQL error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}std::cout << "connect success" << std::endl;mysql_set_character_set(my, "utf8");    // 设置字符集std::string sql;while(true){std::cout << "MySQL>>> ";if(!std::getline(std::cin, sql) || sql == "quit") {std::cout << "bye bye" << std::endl;break;}int n = mysql_query(my, sql.c_str());if(n == 0){std::cout << sql << " success: " << n << std::endl;}else{std::cerr << sql << " failed" << n << std::endl;}} mysql_close(my);return 0;
}

我们来看看如何获取查询结果: 如果 mysql_query 返回成功,那么我们就通过 mysql_store_result 这个函数来读取结果。原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的结果。同时该函数会返回 MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数 malloc 了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result), 不然是肯定会造成内存泄漏的。 执行完 mysql_store_result 以后,其实数据都已经在 MYSQL_RES 变量中了,下面的 api 基本就是读取 MYSQL_RES 中的数据。

获取结果行数 mysql_num_rows
获取结果列数 mysql_num_fields
获取列名 mysql_fetch_fields
如:

	int fields = mysql_num_fields(res);MYSQL_FIELD *field = mysql_fetch_fields(res);for(int i = 0; i < fields; i++){cout<<field[i].name<<" ";} 

获取结果内容mysql_fetch_row
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **. 就当成一个二维数组来用吧

	MYSQL_ROW line;for(i = 0; i < nums; i++){line = mysql_fetch_row(res);for(int j = 0; j < fields; j++){cout << line[j] << " ";} }

🦋 完整代码样例

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "init MySQL error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}std::cout << "connect success" << std::endl;mysql_set_character_set(my, "utf8");    // 设置字符集//std::string sql = "update user set name='Jimmy' where id=2";//std::string sql = "insert into user (name, age, telphone) values ('peter', 19, 6543219876)";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(res == nullptr){std::cerr << "mysql_store_result error" << std::endl;return 4;}my_ulonglong rows = mysql_num_rows(res);my_ulonglong fields = mysql_num_fields(res);std::cout << "行: " << rows << std::endl;std::cout << "列: " << fields << std::endl;// 属性MYSQL_FIELD *fields_array = mysql_fetch_fields(res);for(int i = 0; i < fields; i++){std::cout << fields_array[i].name << '\t';}std::cout << '\n';// 内容for(int i = 0; i < rows; i++){MYSQL_ROW row = mysql_fetch_row(res);       // mysql_fetch_row相当于一个迭代器,会自动向后遍历  MYSQL_ROW 就是一个 char** 的二级指针for(int j = 0; j < fields; j++){std::cout << row[j] << '\t';}std::cout << '\n';}mysql_free_result(res);mysql_close(my);return 0;
}

📚 关闭 mysql 链接 mysql_close

void mysql_close(MYSQL *sock);

📚 另外,mysql C api 还支持事务等常用操作,大家下来自行了解:

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

或者直接通过query函数直接操作都可以

二:🔥 共勉

以上就是我对 【MySQL】使用C语言链接 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词