【MySQL】20. 使用C语言链接

news/2024/5/17 14:47:45

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

  • 保证mysql服务有效
  • 在官网上下载合适自己平台的mysql connect库,以备后用

Connector/C 使用

我们下下来的库格式如下:

[root@iZ0jl69kyvg0h181cozuf5Z ~]# ls /usr/include/mysql
big_endian.h              my_compiler.h       mysql_embed.h      plugin_group_replication.h
binary_log_types.h        my_config.h         mysql.h            plugin.h
byte_order_generic.h      my_config_x86_64.h  mysql_time.h       plugin_keyring.h
byte_order_generic_x86.h  my_dbug.h           mysql_version.h    plugin_validate_password.h
decimal.h                 my_dir.h            mysqlx_ername.h    sql_common.h
errmsg.h                  my_getopt.h         mysqlx_error.h     sql_state.h
keycache.h                my_global.h         mysqlx_version.h   sslopt-case.h
little_endian.h           my_list.h           my_sys.h           sslopt-longopts.h
m_ctype.h                 mysql               my_thread.h        sslopt-vars.h
m_string.h                mysql_com.h         my_thread_local.h  thr_cond.h
my_alloc.h                mysql_com_server.h  my_xml.h           thr_mutex.h
my_byteorder.h            mysqld_ername.h     plugin_audit.h     thr_rwlock.h
my_command.h              mysqld_error.h      plugin_ftparser.h  typelib.h
[root@iZ0jl69kyvg0h181cozuf5Z ~]# ls /usr/include -d
/usr/include
[root@iZ0jl69kyvg0h181cozuf5Z ~]# ls /usr/include/mysql -d
/usr/include/mysql
[root@iZ0jl69kyvg0h181cozuf5Z ~]# 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                         keyring_file.so     rewrite_example.so
authentication_ldap_sasl_client.so  keyring_udf.so      rewriter.so
auth_socket.so                      libmemcached.so     semisync_master.so
connection_control.so               libpluginmecab.so   semisync_slave.so
debug                               locking_service.so  validate_password.so
group_replication.so                mypluglib.so        version_token.so
ha_example.so                       mysql_no_login.so
innodb_engine.so                    mysqlx.so

用vscode进行编写下述代码:

#include <iostream>
#include <mysql/mysql.h>int main()
{std::cout << "mysql client version :" << mysql_get_client_info() << std::endl;return 0;
}

编译并运行

[hx@iZ0jl69kyvg0h181cozuf5Z test_c]$ g++ -o test test.cc -L/lib64/mysql -lmysqlclient
[hx@iZ0jl69kyvg0h181cozuf5Z test_c]$ ll
total 16
-rwxrwxr-x 1 hx hx 9040 Apr  7 13:44 test
-rw-rw-r-- 1 hx hx  157 Apr  7 13:42 test.cc
[hx@iZ0jl69kyvg0h181cozuf5Z test_c]$ ./test
mysql client version :5.7.44

当前MySQL的版本是5.7.44

[hx@iZ0jl69kyvg0h181cozuf5Z test_c]$ ldd testlinux-vdso.so.1 =>  (0x00007ffff7027000)libmysqlclient.so.20 => /usr/lib64/mysql/libmysqlclient.so.20 (0x00007fcf248e3000)libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fcf245db000)libm.so.6 => /lib64/libm.so.6 (0x00007fcf242d9000)libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fcf240c3000)libc.so.6 => /lib64/libc.so.6 (0x00007fcf23cf5000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcf23ad9000)libdl.so.2 => /lib64/libdl.so.2 (0x00007fcf238d5000)librt.so.1 => /lib64/librt.so.1 (0x00007fcf236cd000)/lib64/ld-linux-x86-64.so.2 (0x00007fcf25287000)

g++ 编译时后面带的选项(-L / -l) 所代表的意思,请翻阅之前Linux博客当中的软硬链接这块
通过ldd可以看到test和mysqlclient建立了链接

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

mysql接口介绍

这些接口的具体使用方案可以在MySQL的官网进行查看
我们采用的是C语言的方式链接,所以我们打开C语言的使用文档即可:

1. 初始化与关闭

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

#include <iostream>
#include <mysql/mysql.h>int main()
{MYSQL *my = mysql_init(nullptr);if(nullptr == my){std::cerr << "init MySQL error" << std::endl;return 1;}mysql_close(my);return 0;
}

2. 链接数据库

链接数据库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);

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

#include <iostream>
#include <string>
#include <mysql/mysql.h>//const std::string host = "127.0.0.1";
const std::string host = "localhost";
const std::string user = "hx";
const std::string passwd = "123456";
const std::string db = "scott";
const unsigned int port = 3306;int main()
{// std::cout << "mysql client version :" << mysql_get_client_info() << std::endl;MYSQL *my = mysql_init(nullptr);if(nullptr == my){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_close(my);return 0;
}

3. 下达SQL指令(增删改)

方式1:

    std::string sql;while(true){std::cout << "MySQL>>>";// getline 读取一行sql到cin当中if(!std::getline(std::cin,sql) || sql == "quit"){std::cout << "ByeBye~" << std::endl;break;}int n = mysql_query(my,sql.c_str());// 如果n == 0 那么就获取到sql中的语句if(n == 0){std::cout << sql << "success: " << n << std::endl;}else{std::cerr << sql << "failed: " << n << std::endl;}}

在这里插入图片描述

方式2:

    std:: string sql = "update stu set name='HXHX' where id = 1 "; int n = mysql_query(my,sql.c_str());if(n == 0) std::cout << sql << "success" << std::endl;else std::cout << sql << "failed" << std::endl; 

在这里插入图片描述

解决乱码问题

客户端和服务器端对于编码问题没有达成一致,导致乱码问题
在这里插入图片描述

//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

在这里插入图片描述

4. 下达SQL指令(显示)

    std::string sql = "select * from stu";int n = mysql_query(my,sql.c_str());if(n == 0) std::cout << sql << "success" << std::endl;else {   std::cout << sql << "failed" << std::endl;return 3;} MYSQL_RES *res = mysql_store_result(my);if(nullptr == res){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);for(int j = 0; j < fields; j++){std::cout << row[j] << "\t";}std::cout << "\n";}

MYSQL_RES *res中不仅包含内容还包含属性
在这里插入图片描述
在这里插入图片描述
原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。
同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。

支持事务

另外,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);

http://www.mrgr.cn/p/00850520

相关文章

【springCloud】版本学习

Spring Cloud介绍 官网地址&#xff1a;https://spring.io/projects/spring-cloud Spring Cloud 是一个基于 Spring Boot 的微服务架构解决方案&#xff0c;它提供了一系列工具和模式来帮助开发者构建分布式系统。Spring Cloud 的组件和模式包括配置管理、服务发现、断路器、…

P8968

太牛了。太 nb 了。 不会博弈,不会推导,盲猜全部是同种电荷,此时神明的决策固定且易于刻画,对着样例模拟一下发现对了,写一发过了 easy ver,于是不管正确性直接来想 hard ver。 考虑向上跳的过程大致操作为 \(x\gets x+\min(x,a_i)\),直觉上不存在好的维护方法。 注意到…

ELK日志收集和备份填坑实战 (滞后8个小时等时区问题)

ES的备份&#xff1a;ES快照备份 根据时间&#xff0c;每天零点在Linux机器crontab来调用api接口实现快照备份&#xff0c;通过快照备份&#xff0c;可以定准恢复到某一天的日志。 现象&#xff1a;&#xff08;坑&#xff1a;但是恢复某一天日志&#xff0c;发现会少8小时的日…

初学python记录:力扣2007. 从双倍数组中还原原数组

题目&#xff1a; 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双倍 数组&#xff0c;那么请你返…

shell系统函数和流程控制

系统函数: 1、简单示例:点击查看代码 #!/bin/bash filename="$1"_log_$(datename +%S) echo $filenamebasename:基本语法: basename [string/pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(/)字符,然后将左右字符显示出来。 basename…

RocketMQ并发消息消费重试DEMO

无序消息的重试只针对集群消费模式生效&#xff1b;广播消费模式不提供失败重试特性 Producer 发了100个对象消息 public class AddProducer {public static void main(String[] args) throws Exception {DefaultMQProducer producer new DefaultMQProducer("a-group&q…

春秋云境:CVE-2022-32991[漏洞复现]

从CVE官网查询该漏洞相关信息 该漏洞是由于welcome.php中的eid参数包含了SQL注入漏洞 则我们的目标就在于寻找welcome.php地址以及相关的可注入eid参数 开启靶机 先在页面正常注册、登录一个账号。密码随便填 进入了home目录&#xff0c;这里有三个话题可以选择开启 随便选…

模拟电路学习笔记——晶体管电流放大作用

基本共射放大电路△u1为输入电压信号,接入基极——发射极回路,称为输入回路;放大后的信号在集电极——发射极回路,称为输出回路;因发射极是两个回路的公共端,故称该电路为共射放大电路晶体管工作在放大状态的外部条件:发射结正向偏置,集电结反向偏置输入回路中基极电源…

MATLAB偏最小二乘回归(PLSR)和主成分回归(PCR)分析光谱数据

全文链接:http://tecdat.cn/?p=2655 最近我们被客户要求撰写关于偏最小二乘回归(PLSR)和主成分回归(PCR)的研究报告,包括一些图形和统计输出。 此示例显示如何在matlab中应用偏最小二乘回归(PLSR)和主成分回归(PCR),并讨论这两种方法的有效性 当存在大量预测变量时…

UE5 C++ 射线检测

一.声明四个变量 FVector StartLocation;FVector ForwardVector;FVector EndLocation;FHitResult HitResult;二.起点从摄像机&#xff0c;重点为摄像机前9999m。射线检测 使用LineTraceSingleByChannel 射线直线通道检测&#xff0c;所以 void AMyCharacter::Tick(float Delt…

matlab使用经验模式分解emd 对信号进行去噪

原文链接 : http://tecdat.cn/?p=2567 原文出处:拓端数据部落公众号对于这个例子,考虑由具有明显频率变化的正弦波组成的非平稳连续信号。手提钻的振动或烟花声是非平稳连续信号的例子。 以采样频率加载非平稳信号数据fs,并可视化混合正弦信号。 htmlload(sinusoidalSigna…

Spring Boot 学习(3)——Spring Initializr 创建项目问题解决

产生问题的原因&#xff0c;各种的版本都较老&#xff0c;所以导致出现问题。目前暂未打到合适的教程&#xff0c;按老教程学起来先。 小白瞎学&#xff0c;大神勿喷&#xff01; 再次强调环境&#xff1a;maven 3.3.9、jdk 1.8、idea 2017、Spring 4.3.13、Spring Boot 1.5.…

Linux学习之路 -- PCB介绍 -- 进程优先级

1、什么是优先级&#xff1f; 进程需要某一种资源&#xff0c;而系统要通过特定的方式来决定谁先获得这些资源&#xff0c;而系统的做法就是给不同的进程安排不同的优先级。让优先级高的进程先享有一些资源。 2、为什么要有优先级 因为资源的缺乏&#xff0c;所以系统的才会…

linux进程与计划(2)

五大性能性能 命令内存使用率 free,topCPU使用率 top,ps,w硬盘使用率 df硬盘读写性能 dd,iostat网络带宽 iftopps -ef 命令输出信息 如果不想看到所有的进程,只想查看一下当前登录产生了哪些进程,那只需使用 "ps -l" 命令就足够了 CPU 在运算数据时,不是把一个集成…

软件产品许可证书 Licence 全流程研发(使用非对称加密技术,既安全又简单)

本篇博客对应的代码地址&#xff1a; Gitee 仓库地址&#xff1a;https://gitee.com/biandanLoveyou/licence 1、背景介绍 公司是做软件 SAAS 服务的&#xff0c;一般来说软件部署有以下几种常见的模式&#xff1a; 1、自己研发和部署到自己的云服务器&#xff0c;然后有偿提供…

ts中的dom元素和event事件类型声明

1, HTMLElement 和 Element<div id="divClick"></div>const docu = document.getElementById(divClick);const docu1 = document.querySelector(#divClick);把鼠标分别放在docu和docu1上:HTMLElement HTMLElement 是 HTML 文档中某个元素的具体类型,该…

debian安装和基本使用

debian安装和基本使用 文章目录 debian安装和基本使用1. 为什么选择debian2. 如何下载Debian2.1 小型安装镜像2.2 完整安装镜像 3. Debian操作系统安装3.1 创建Debian虚拟机3.2 安装操作系统 4. Debian系统的初始设置4.1 桌面环境的配置4.2 配置网络4.3 生效网络配置4.4 配置de…

大模型日报|今日必读的6篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.Google DeepMind 新研究&#xff1a;多样本上下文学习 目前&#xff0c;大型语言模型&#xff08;LLMs&#xff09;最擅长的是 “少样本上下文学习”&#xff08;ICL&#xff09;—— 即在推理时从上下文中提供的少…

反转二叉树(力扣226)

解题思路&#xff1a;用队列进行前序遍历的同时把节点的左节点和右节点交换 具体代码如下&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root NULL) return root;swap(root->left, root->right); // 中invertTree(root->left)…