MySQL使用C语言连接

 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去MySQL官网下载。

1.引入库

1.选择Download Archivs

因为我们要连接的是C语言,所以选择Connector/C。

选择合适的版本下载,我这里

下载完之后,我们使用rz命令将刚刚下载的包传送到服务器上

传送完成之后我们会发现多了一个文件。

使用tar命令将压缩包解压会生成一个目录。

目录中包含了include目录和lib目录,include中存放的是mysql相关的头文件,而lib中就是动静态库。

2.使用库

我们先使用库中的函数。

#include <stdio.h>
#include <mysql.h>
int main()
{
    printf("mysql client Version: %s\n", mysql_get_client_info());
    return 0;
}

当我们在项目中想使用这个库,我们可以先创建两个软连接,连接到include和lib目录下。

此时我们编译后会生成一个可执行文件

  • -I:用于指明头文件搜索路径
  • -L:用于指明库文件搜索路径
  • -l:指明库文件中的哪一个库

但是这个可执行文件是不能运行的,使用mysqlclient库时,在系统的搜索路径下没找到。此时我们有三种方案

1.将mysqlclient库文件拷贝到系统默认的库文件搜索路径中。

2.将mysqlclient库文件所在路径拷贝到LD_LIBRARY_PATH环境变量中。

3.将mysqlclient库文件所在的路径保存到 /etc/ld.so.conf.d/ 目录下以 .conf为后缀的文件当中,并使用ifconfig命令更新

解决成功之后,我们就可以正常运行了

刚刚运行的结果就是我们下载的mysql库的版本。

3.mysql接口介绍

3.1mysql对象

连接数据库前,我们需要创建一个MySQL对象

MYSQL *mysql_init(MYSQL *mysql);

参数为null时,函数自动返回一个MySQL对象,如果参数为一个地址,函数会在该地址处帮你完成初始化。

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

3.2mysql连接

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:使用mysql_init创建的对象
  • host:要连接的MySQL服务器IP地址
  • user:连接MySQL服务器时的用户名
  • passwd:连接MySQl服务器时的用户密码
  • db:你要访问的数据库
  • port:要连接的MySQL服务器的端口号
  • unix_socket:连接时应该使用的套接字或者管道,通常为NULL
  • clientflag:表示允许特定功能,通常为0

连接成功返回MySQL对象(与第一个参数值相同),失败返回NULL。

3.3mysql关闭

void mysql_close(MYSQL* sock);

与mysql_init搭配使用,释放mysql_init创建的对象。

#include <iostream>
#include <string>
#include <unistd.h>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1";
const std::string user = "cola";
const std::string possward = "hsu@177118";
const std::string db = "student";
const unsigned int port = 3306;

int main()
{
    MYSQL *my = mysql_init(nullptr);
    if (nullptr == my)
    {
        std::cerr << "init mysql error" << std::endl;
        return 1;
    }

    MYSQL *ret = mysql_real_connect(my, host.c_str(), user.c_str(), possward.c_str(), db.c_str(), port,
                                    nullptr, 0);
    if (ret == nullptr)
    {
        std::cerr << "mysql_real_connect error" << std::endl;
        return 2;
    }
    std::cout << "数据库连接成功" << std::endl;

    mysql_close(my);
    std::cout << "数据库关闭成功" << std::endl;

    return 0;
}

这样就连接成功了。

3.4 mysql命令

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

第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”,最后可以不带分号。

3.5设置编码格式

mysql_set_character_set(myfd, "utf8");

建立好链接之后,获取英文没有问题,如果获取中文是乱码(两端编码格式不同)设置链接的默认字符集是utf8,原始默认是latin1。

  • 测试:
#include <iostream>
#include <string>
#include <unistd.h>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1";
const std::string user = "cola";
const std::string possward = "hsu@177118";
const std::string db = "student";
const unsigned int port = 3306;

int main()
{
    //连接数据库
    MYSQL *my = mysql_init(nullptr);
    if (nullptr == my)
    {
        std::cerr << "init mysql error" << std::endl;
        return 1;
    }
    //设置编码格式
    mysql_set_character_set(my, "utf8");
    MYSQL *ret = mysql_real_connect(my, host.c_str(), user.c_str(), possward.c_str(), db.c_str(), port,
                                    nullptr, 0);
    if (ret == nullptr)
    {
        std::cerr << "mysql_real_connect error" << std::endl;
        return 2;
    }
    std::cout << "数据库连接成功" << std::endl;

    //插入数据
    std::string sql = "insert into user values (8, 56, '周伯通')";
    int n = mysql_query(my, sql.c_str());
    if (n != 0)
    {
        std::cerr << "mysql_query error" << std::endl;
    }
    else 
    {
        std::cout << "下达指令成功" << std::endl;
    }

    //关闭数据库
    mysql_close(my);
    std::cout << "数据库关闭成功" << std::endl;

    return 0;
}

这段代码就是连接数据库后,向数据库中插入信息。

当我们执行这段代码之后会发生,真的成功插入了。

3.6获取查询结果

如果我们直接使用mysql_query函数,并在参数中使用select是无法观察到查询结果的。如果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

my_ulonglong mysql_num_rows(MYSQL_RES *res);

获取结果列数mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES *res);

获取列名mysql_fetch_fields,返回的是一个结构体,结构体中保存着对应列的列属性。

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

通过这几个函数的搭配就能成功获取到查询结果。

例如:

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

上面的代码就是获得查询结果的列信息。

获取结果内容mysql_fetch_row

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


  • 演示:
#include <iostream>
#include <string>
#include <unistd.h>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1";
const std::string user = "cola";
const std::string possward = "hsu@177118";
const std::string db = "student";
const unsigned int port = 3306;

int main()
{
    // 连接数据库
    MYSQL *my = mysql_init(nullptr);
    if (nullptr == my)
    {
        std::cerr << "init mysql error" << std::endl;
        return 1;
    }
    // 设置编码格式
    mysql_set_character_set(my, "utf8");
    MYSQL *ret = mysql_real_connect(my, host.c_str(), user.c_str(), possward.c_str(), db.c_str(), port,
                                    nullptr, 0);
    if (ret == nullptr)
    {
        std::cerr << "mysql_real_connect error" << std::endl;
        return 2;
    }
    std::cout << "数据库连接成功" << std::endl;

    // 查询数据
    //  std::string sql = "insert into user values (8, 56, '周伯通')";
    std::string sql = "select * from user";
    int n = mysql_query(my, sql.c_str());
    if (n != 0)
    {
        std::cerr << "mysql_query error" << std::endl;

    }
    else
    {
        std::cout << "下达指令成功" << std::endl;
    }

    // 获取查询结果
    MYSQL_RES *res = mysql_store_result(my);
    if (nullptr == res)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 3;
    }
    //打印列名
    int fieldnum = mysql_num_fields(res);
    MYSQL_FIELD *field = mysql_fetch_fields(res);
    for (int i = 0; i < fieldnum; i++)
    {
        std::cout << field[i].name << " ";
    }
    std::cout << std::endl;

    //打印内容
    int rows = mysql_num_rows(res);
    int fields = mysql_num_fields(res);

    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] << " ";
        }
        std::cout << std::endl;
    }
    free(res);

    // 关闭数据库
    mysql_close(my);
    std::cout << "数据库关闭成功" << std::endl;

    return 0;
}

最终也是将数据库中的内容成功打印了

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

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

相关文章

AtCoder Beginner Contest 347 (ABCDEF题)视频讲解

A - Divisible Problem Statement You are given positive integers N N N and K K K, and a sequence of length N N N, A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\ldots,A_N) A(A1​,A2​,…,AN​). Extract all elements of A A A that are multiples of K K K, divi…

鸿蒙HarmonyOS应用开发之HID DDK开发指导

场景介绍 HID DDK&#xff08;HID Driver Develop Kit&#xff09;是为开发者提供的HID设备驱动程序开发套件&#xff0c;支持开发者基于用户态&#xff0c;在应用层开发HID设备驱动。提供了一系列主机侧访问设备的接口&#xff0c;包括创建设备、向设备发送事件、销毁设备。 …

腾讯云2核4G服务器优惠价格165元一年,限制500GB月流量

腾讯云轻量2核4G5M服务器租用价格165元1年、252元15个月、三年900元&#xff0c;配置为轻量2核4G5M、5M带宽、60GB SSD盘、500GB月流量、上海/广州/北京&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 腾讯云轻量2核4G5M服务器租用价格 腾讯云&#xff1a;轻量应用服务器1…

SpringBoot + Vue3邮件验证码功能的实现

后端 SpringBootmavenmysqlIDEA 后端负责编写邮件发送的接口逻辑&#xff0c;具体流程如下: 引入相关依赖配置邮箱信息编写邮件发送服务接口OK 引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail --> <dependen…

基于FreeRTOS系统的STM32简易遥控器设计

项目说明 该项目是一个基于FreeRTOS系统的Stm32遥控器设计。使用该项目主要是自己学习FreeRTOS的使用&#xff0c;以及模块化编程的思想。这个项目应该长期会有更新。 项目开源 github:https://github.com/snqx-lqh/Stm32RemoteControl gitee:https://gitee.com/snqx-lqh/S…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件&#xff1a;安装 conda配置环境变量验证 Conda 安装结果创建环境&#xff1a;python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统&#xff0c;由Continuum Analytics公司开发。它可以安…

【InternLM 实战营第二期笔记】InternLM1.8B浦语大模型趣味 Demo

体验环境 平台&#xff1a;InternStudio GPU&#xff1a;10% 配置基础环境 studio-conda -o internlm-base -t demo 与 studio-conda 等效的配置方案 conda create -n demo python3.10 -y conda activate demo conda install pytorch2.0.1 torchvision0.15.2 torchaudio2…

使用MySQL和PHP创建一个公告板

目录 一、创建表 二、制作首页&#xff08;创建主题以及显示列表&#xff09; 三、制作各个主题的页面&#xff08;输入回帖和显示列表&#xff09; 四、制作消息的查询界面 五、制作读取数据库信息的原始文件 六、制作数据重置页面 七、效果图 八、问题 1、目前无法处…

轻量应用服务器16核32G28M腾讯云租用优惠价格4224元15个月

腾讯云16核32G服务器租用价格4224元15个月&#xff0c;买一年送3个月&#xff0c;配置为&#xff1a;轻量16核32G28M、380GB SSD盘、6000GB月流量、28M带宽&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云16核32G服务器租用价格 腾讯…

三栏布局——面试/笔试题

目录 三栏布局(两端指定宽度&#xff0c;中间自适应)三栏布局(平均分布) 三栏布局(两端指定宽度&#xff0c;中间自适应) 只介绍简单的写法&#xff0c;圣杯布局之类的比较复杂&#xff0c;实际上越简单越好&#xff0c;所以复杂的就不介绍了 flex布局 <!DOCTYPE html>…

vultr ubuntu 服务器远程桌面安装及连接

一. 概述 vultr 上开启一个linux服务器&#xff0c;都是以终端形式给出的&#xff0c;默认不带 ui 桌面的&#xff0c;那其实对于想使用服务器上浏览器时的情形不是很好。那有没有方法在远程服务器安装桌面&#xff0c;然后原程使用呢&#xff1f;至少ubuntu的服务器是有的&am…

HTTP/1.1、HTTP/2、HTTP/3 演变(计算机网络)

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接改善了短连接造成的性能开销。支持管道网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c…

数据库----数据类型正确选择

mysql支持的数据类型&#xff1a; 数值型&#xff0c;如INT&#xff0c;BIGINT&#xff0c;FLOAT和decimal 日期和时间类型&#xff0c;如DATE,TIME和TIMESTAMP等 字符串类型&#xff0c;如VARCHAR,CHAR和BLOB 空间数据类型&#xff0c;如GEOMETRY&#xff0c;POINT和POLYGON J…

解决创建springboot项目时,无法选中java8的问题

主要原因是springboot3.0.0以上版本需要jdk17. 问题描述&#xff1a; 解决办法&#xff1a; 在Server url上点击齿轮&#xff0c;把http://start.springboot.io/更改为https://start.aliyun.com/ 效果如下

速通汇编(三)寄存器及汇编mul、div指令

一&#xff0c;寄存器及标志 AH&ALAX(accumulator)&#xff1a;累加寄存器BH&BLBX(base)&#xff1a;基址寄存器CH&CLCX(count)&#xff1a;计数寄存器DH&DLDX(data)&#xff1a;数据寄存器SP(Stack Pointer)&#xff1a;堆栈指针寄存器BP(Base Pointer)&#…

C#调用FreeSpire.Office读取word数据的基本用法

FreeSpire.Office是Spire.Office的免费版本&#xff0c;后者支持全面、复杂的office文件操作功能&#xff0c;包括文件格式转换、文档操作、文档打印等&#xff0c;详细介绍见下图及参考文献1。本文学习FreeSpire.Office的基本用法并用其获取word文档的基本信息。   新建Win…

python统计分析——双样本均值比较

参考资料&#xff1a;python统计分析【托马斯】 1、配对样本t检验 在进行两组数据之间的比较时&#xff0c;有两种情况必须区分开。在第一种情况中&#xff0c;同一对象在不同时候的两个记录值进行相互比较。例如&#xff0c;用学生们进入初中时的身高和他们一年后的身高&…

学习transformer模型-Positional Encoding位置编码的简明介绍

今天介绍transformer模型的positional encoding 位置编码 背景 位置编码用于为序列中的每个标记或单词提供一个相对位置。在阅读句子时&#xff0c;每个单词都依赖于其周围的单词。例如&#xff0c;有些单词在不同的上下文中具有不同的含义&#xff0c;因此模型应该能够理解这…

鸿蒙OS开发实例:【ArkTS 实现MQTT协议】

介绍 MQTT是物联网中的一种协议&#xff0c;在HarmonyOS API9平台&#xff0c;解决方案以C库移植为实现方案。 遥遥领先的平台&#xff0c;使用MQTT怎能不遥遥领先呢&#xff01; 新年快乐&#xff0c;本篇将带领你手把手实现HarmonyOS ArkTS语言的MQTT协议。 准备 阅读…

LLM--提示词Propmt的概念、作用及如何设计提示词

文章目录 1. 什么是提示词&#xff1f;2. 提示词的作用3. 如何设计提示词&#xff1f;3.1. 提供详细的信息3.2. 指定角色3.3. 使用分隔符和特殊符号3.4. 提供示例3.5. 少量示例的思维链&#xff08;COT&#xff09;模型3.6. 思维树&#xff08;TOT&#xff09;模型3.7. 自洽性 …