MySQL 如何用C语言连接

✨✨✨励志成为超级技术宅 ✨✨✨


本文主要讲解在Linux服务器上,如何使用c语言MySQL库的接口来对MySQL数据库进行操作,如果没有服务器安装MySQL,也可以先学学看怎么用c语言mysql库的接口,还是比较容易的了。(●☌◡☌●)。那么开始讲解吧!

一.部分接口讲解

我们先来看接口的定义,这部分比较无聊,我们也可以先看第二部分的代码使用 ,再返回来看看。

1.MYSQL *mysql_init(MYSQL *mysql)

作用:对数据库进行初始化,要使用库,必须先进行初始化

参数:MYSQL *mysql:这是一个指向 MYSQL 结构体的指针。如果传入 NULLmysql_init 会分配一个新的 MYSQL 结构体并返回其指针。如果传入一个非 NULL 的指针,mysql_init 会初始化这个已经存在的 MYSQL 结构体。我们一般都是直接传入NULL,如 MYSQL * mysql=mysql_init(nullptr);这样使用就行。

返回值:

  • 成功时,mysql_init 返回一个指向 MYSQL 结构体的指针。这个指针可以用于后续的数据库连接操作。
  • 失败时,返回 NULL。这通常发生在内存分配失败的情况下。

2.MYSQL *mysql_real_connect()

完整接口: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服务器。

参数:

  1. MYSQL *mysql:这是一个已经通过 mysql_init 初始化的 MYSQL 连接句柄。
  2. const char *host:MySQL 服务器的主机名或 IP 地址。可以是 NULL"localhost",表示连接到本地服务器。
  3. const char *user:用于连接数据库的用户名。
  4. const char *passwd:对应用户的密码。
  5. const char *db:要连接的数据库名,也可以置为空,后面调用其他接口选择。
  6. unsigned int port:MySQL 服务器的端口号。如果设置为 0,则使用默认端口(通常是 3306)。
  7. const char *unix_socket:UNIX 套接字文件的路径,我们通常设置为 NUll,使用默认的 UNIX 套接字文件路径。
  8. unsigned long client_flag:客户端标志,用于指定连接选项。可以是多个标志的按位或组合,比如 CLIENT_INTERACTIVECLIENT_FOUND_ROWS 等,我们通常置为0就行。

返回值:

  • 成功时,mysql_real_connect 返回一个指向 MYSQL 结构体的指针(与传入的 mysql 参数相同)。这个指针表示一个成功的数据库连接,可以用于后续的数据库操作。
  • 失败时,返回 NULL。此时,可以通过调用 mysql_error 函数来获取关于连接失败的更多信息。

3. int mysql_set_character_set(MYSQL *mysql, const char *csname)

作用:设置数据库字符集

参数:1.初始化的 MYSQL 连接句柄,2要设计的字符集名称

返回值:

  • 成功时,mysql_set_character_set 返回 0
  • 失败时,返回非零值。此时,可以通过调用 mysql_error 函数来获取关于设置字符集失败的更多信息。

4.int mysql_query(MYSQL *mysql, const char *q)

作用:执行sql语句

参数:1.初始化的 MYSQL 连接句柄,2要执行的sql语句

返回值:

  • 成功时, 返回 0
  • 失败时,返回非零值。此时,可以通过调用 mysql_error 函数来获取关于设置字符集失败的更多信息。

5.void mysql_close(MYSQL*mysql)

作用:关闭连接,释放句柄

参数:初始化的 MYSQL 连接句柄

二.代码使用

首先我们先登入MySQL客户端查看并选择我们需要连接的数据库

这里我们选择gobang数据库进行连接。

我们直接看代码来学学看怎么使用:

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

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "147258Ll!"
#define DBNAME "gobang"
int main()
{
    //1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL * mysql=mysql_init(nullptr);


    //2. 连接服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,nullptr,0);


     //3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    int ret=mysql_set_character_set(mysql,"utf8");


    //4. 选择要操作的数据库
    //之前选择了数据库这里可以不写
    // int mysql_select_db(mysql, dbname)
    //mysql_select_db(mysql, DBNAME);

      //5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    const char *sql = "insert stu values(100,'xixi','17');";
    mysql_query(mysql,sql);

    //6.关闭连接,释放句柄
    mysql_close(mysql);
    return 0;
}

这里我们通过c语言接口连接gobang数据库,并向stu表插入一条数据(100,xixi,17)。

我们先来看看表结构:

表中有三个属性id,name,age,运行上面的代码我们来看看结果 。

可以看到插入成功。但是这里我们执行的SQL语句并不需要结果数据,如果是select语句需要返回结果集,我们要看到对应的结果那么应该如何使用?这里我们还要学学其他接口

三.与结果集有关的其他接口

1.MYSQL_RES *mysql_store_result(MYSQL *mysql)

作用:讲sql语句执行的保存结果到本地

参数:mysql句柄

返回值:指向结果集的指针,失败为空

2.int mysql_num_rows(MYSQL_RES *res)和int mysql_num_fields(res);

作用:获取结果集的行数和列数

参数:结果集指针

返回值:行数和列数

3.MYSQL_ROW mysql_fetch_row(MYSQL_RES*res)

作用:按行遍历结果集

参数:结果集指针

返回值:MYSQL_ROW ,本质是二级指针char* *,指向一行结果集的一条记录,访问过后会自动移向下一条记录。

我们在使用过程会通常会讲上面的接口一起结合起来遍历结果集。

四.代码使用

我们再来看看包含所有接口的代码:

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

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "147258Ll!"
#define DBNAME "gobang"
int main()
{
    //1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL * mysql=mysql_init(nullptr);


    //2. 连接服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,nullptr,0);


     //3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    int ret=mysql_set_character_set(mysql,"utf8");


    //4. 选择要操作的数据库
    // int mysql_select_db(mysql, dbname)
    mysql_select_db(mysql, DBNAME);

      //5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    const char *sql = "insert stu values(100,'xixi','17');";
    mysql_query(mysql,sql);
    const char*sql2="select *from stu;";
    mysql_query(mysql,sql2);



    //6. 如果sql语句是查询语句,则需要保存结果到本地
    // MYSQL_RES *mysql_store_result(MYSQL *mysql)
     MYSQL_RES *res=mysql_store_result(mysql);



     //7. 获取结果集中的结果条数
    // int mysql_num_rows(MYSQL_RES *res);
    // int mysql_num_fields(MYSQL_RES *res);
    int rows_num=mysql_num_rows(res);
    int cols_num=mysql_num_fields(res);


    //8. 遍历保存到本地的结果集
    for(int i=0;i<rows_num;i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j=0;j<cols_num;j++)
        {
            std::cout<<row[j]<<std::endl;
        }
    }

    //9. 释放结果集
     mysql_free_result(res);
   
    //10. 关闭连接,释放句柄
    mysql_close(mysql);
    return 0;
}

运行结果:

用c语言连接数据库就讲解到这了,我们只要按流程依此使用相关接口就行了,还是挺简单的吧,感觉有帮助还请点个赞了,这真的很重要!(๑•́ ₃ •̀๑)/

相关推荐
远歌已逝14 分钟前
维护在线重做日志(二)
数据库·oracle
qq_433099401 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz1 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺3 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i5 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl5 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502775 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空5 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
Oak Zhang6 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存