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

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 test
        linux-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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Servlet的文件上传下载

Servlet的文件上传|下载 二、文件上传实现 2.1实现思路 需要使用到Commons-FileUpload组件需要将jsp页面form表单的enctype属性值设置为“multipart/form-data”&#xff0c;Servlet中使用IO流实现文件的上传 2.2、实现过程 2.2.1新建web项目导入jar包 <dependency>…

weblogic oracle数据源配置

在weblogic console中配置jdbc oracle数据源 1. base_domain->Service->DataSources 在Summary of JDBC Data Sources中&#xff0c;点击New, 选择【Generic Data Source】通用数据源。 2. 设置数据源Name和JNDI name 注&#xff1a;设置的JNDI Name是Java AP中连接…

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM…

Grok-1.5 Vision:X AI发布突破性的多模态AI模型,超越GPT 4V

在人工智能领域&#xff0c;多模态模型的发展一直是科技巨头们竞争的焦点。 近日&#xff0c;马斯克旗下的X AI公司发布了其最新的多模态模型——Grok-1.5 Vision&#xff08;简称Grok-1.5V&#xff09;&#xff0c;这一模型在处理文本和视觉信息方面展现出了卓越的能力&#x…

Elasticsearch分布式搜索

实用篇-ES-环境搭建 ES是elasticsearch的简称。我在SpringBoot学习 数据层解决方案 的时候&#xff0c;写过一次ES笔记&#xff0c;可以结合一起看一下。 之前在SpringBoot里面写的相关ES笔记是基于Windows的&#xff0c;现在我们是基于docker容器来使用&#xff0c;需要你们提…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性&#xff0c;允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法&#xff1a; &#xff08;1&#xff09;基本属性 cx 和 cy&#xff1a;这两个属性定义了椭圆中心…

【CicadaPlayer】prepare和start的触发和异步处理

主线程可以直接用SuperMediaPlayer 但SuperMediaPlayer 的处理是异步的。实际上msgproc的目的在于异步处理外部请求 例如,启动后会先设置view,这个与播放流程无关,但是是必须要让播放器拥有的。用户点击prepare是直接调用SuperMediaPlayer的Prepare接口,才会触发url的设置 …

数据结构--栈,队列,串,广义表

3.栈 &#xff08;先进后出&#xff09; 栈是一种特殊的线性表&#xff0c;只能从一端插入或删除操作。 4.队列 4.1 4.1.1初始化 4.1.2判断队列是否为空 4.1.3判断队列是否为满 4.1.4入队 4.1.5出队 4.1.6打印队列 4.1.7销毁队列 5.串 5.1 串的定义 由零个或者任意多…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

VMware安装Linux虚拟机(rocky9)

软件准备&#xff1a; VMware虚拟机ISO系统镜像文件 选择创建虚拟机→典型→下一步→点击稍后安装操作系统 选择Linux系统和对应版本 输入虚拟机名称和选择保存位置 设置磁盘大小 根据需要自定义硬件配置→完成 然后点击编辑虚拟机设置→CD/DVD→选择ISO镜像 然后开启虚拟机→…

vue2 二次封装element 组件,继承组件原属性,事件,插槽 示例

测试页面代码 这里主要记录如何封装element的el-input 并且封装后具有el-input原本的属性 事件 插槽 下面为测试页面即组件调用 <script> import CustomInput from /components/CustomInput.vue;export default {name: TestPage,components: { CustomInput },data() …

【洛谷 P4017】最大食物链计数 题解(深度优先搜索+动态规划+邻接表+记忆化搜索+剪枝)

最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是重复数了几条或漏掉了几条。于是她来就来求助你&#xff0c;然而你也不会啊&#xff01;写一个程序来帮帮她吧。 题目描述 给你一个…

【CSS面试题】Flex实现九宫格

考察知识&#xff1a; flex布局 水平垂直居中的实现 初始效果 代码关键&#xff1a;给父盒子添加以下属性 flex-wrap: wrap; /* 允许换行 */justify-content: space-around; /* 主轴对齐方式 */align-content: space-around; /* 多行在侧轴上的对齐方式 */<!DOCTYPE html&…

如何让Nrf connect、EFR connect直接显示特征值数据及其单位

效果如图&#xff1a;app直接显示了我的温度&#xff0c;并且有两位小数&#xff0c;还有温度单位。这是怎么做到的呢&#xff1f; 这次我们仍以TLS8258为例&#xff0c;当然如果是其他蓝牙芯片&#xff0c;配置方式也是大差不差&#xff0c;规则一样的。 #define GATT_CHARA…

租用马来西亚服务器:稳定高效的网络选择

马来西亚首都是吉隆坡。作为一个新兴的多元化经济国家&#xff0c;也属于亚洲四小龙之一。地理位置优越&#xff0c;中间隔着南中国海。一部分是北接泰国的位于马来半岛的西马来西亚&#xff0c;另一部分则是东马来西亚&#xff0c;在婆罗洲岛的北部。这种地理位置有利于促进该…

[Java EE] 计算机工作原理与操作系统简明概要

1. 计算机工作原理 1.1 生活中常见的计算机 计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"…

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件&#xff0c;点击“继续” 初始文件安装完成后选择我们需要安装的项&#xff0c;并勾选好必要的单个组件&#xff0c;设…

cookie与session及其区别

一、cookie 1. 为什么需要cookie&#xff1f; web程序使用HTTP协议进行传输&#xff0c;而HTTP协议是无状态的协议&#xff08;即对事务处理无记忆性&#xff0c;如果后续处理需要使用前面的信息&#xff0c;只能重传&#xff0c;导致每次连接传送的数据量增大&#xff09;。c…

maven3.9+下载安装

maven介绍 Maven 是一个项目管理和理解工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;概念。Maven 可以帮助开发者定义项目结构、依赖关系、构建过程以及其他任务。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。Maven 的主要目标是简化构建…