Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造

准备工作


数据库


创建一个数据库(我的是test),并建表(我的是example)



知识准备


https://blog.csdn.net/weixin_45525272/article/details/108015027


1.连接代码



/*************************************************************************
    > File Name: connect.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 20时39分56秒
 ************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名
int main(int argc, char* argv[])
{
    // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("测试成功!\n");
    // 最后关闭连接
    mysql_close(mysql);
    return 0;
}


2.查询代码



/*************************************************************************
    > File Name: connect.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 20时39分56秒
 ************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名
// 打印结果集函数
void show_result(MYSQL_RES * result)
{
  //打印表头
  unsigned int num_fields;
  unsigned int i;
    // MYSQL_FIELD 该结构包含关于字段的信息,如字段名、类型和大小
  MYSQL_FIELD *fields;
  // 返回结果集中的行数。
  num_fields = mysql_num_fields(result);
    // mysql_fetch_fields 对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。
  fields = mysql_fetch_fields(result);
    // 输出结果
  for(i = 0; i < num_fields; i++)
  {
     printf("%s\t", fields[i].name);
  }
    // 这个输出是打造表的结构边框便于查看数据,准确的输出按照你的数据自行增加减去+号
  printf("\n+----+-------+\n");
  // 行数
  MYSQL_ROW row;
    num_fields = mysql_num_fields(result);//取字段个数
  while ((row = mysql_fetch_row(result)))//循环取一行
  {
     for(i = 0; i < num_fields; i++)
     {
           // 看是否为空
         printf("%s\t",  row[i] ? row[i] : "NULL");
     }
     printf("\n");
  }
}
int main(int argc, char* argv[])
{
    // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("数据库连接成功!\n"); 
    // 定义查询语句
    char rSql[256]={0};
    // 我的表名为example
    strcpy(rSql,"select * from example");
    // 查询指向的SQL查询
    if(mysql_query(mysql,rSql) != 0){
      printf("mysql_query err! 查询失败\n");
      exit(1);
    }
    // 取回结果集
    int i=0;
    // mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
    MYSQL_RES * result = mysql_store_result(mysql);
    MYSQL_ROW row;
    if(result != NULL){
      //需要打印结果集
      show_result(result);
    mysql_free_result(result);//释放结果集
    }
    // 最后关闭连接
    mysql_close(mysql);
    printf("数据库关闭成功!\n");
    return 0;
}


3.插入代码



/*************************************************************************
    > File Name: insert.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 21时44分30秒
 ************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名
int main(int argc, char* argv[]){
    // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("数据库连接成功!\n");
    // 定义查询语句
    char rSql[256]={0};
    strcpy(rSql,"insert into example values(4,'admin')");
    if(mysql_query(mysql,rSql) != 0){
      printf("mysql_query err\n");
      exit(1);
    }
    printf("数据插入成功!\n");
    // 最后关闭连接
    mysql_close(mysql);
    return 0;
}


4.客户端代码



/*************************************************************************
    > File Name: client.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 21时49分15秒
 ************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名
void show_result(MYSQL_RES * result,MYSQL *mysql)
{
  //打印表头
  unsigned int num_fields;
  unsigned int i;
  MYSQL_FIELD *fields;
  num_fields = mysql_num_fields(result);
  fields = mysql_fetch_fields(result);
  for(i = 0; i < num_fields; i++)
  {
     printf("%s\t", fields[i].name);
  }
  printf("\n----------------------------------------------------------\n");//华丽分割线
  MYSQL_ROW row;
    num_fields = mysql_num_fields(result);//取字段个数
  while ((row = mysql_fetch_row(result)))//循环取一行
  {
     for(i = 0; i < num_fields; i++)
     {
         printf("%s\t",  row[i] ? row[i] : "NULL");
     }
     printf("\n");
  }
  printf("\n----------------------------------------------------------\n");//华丽分割线
  //3 rows in set (0.28 sec)
  printf("%ld rows in set \n",mysql_affected_rows(mysql));//影响的数目
}
int main(int argc, char* argv[]){
        // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("数据库连接成功!\n");
    // 客户端操作
    printf("welcome to mysql!\n");
    char rSql[1024]={0};
    printf("输入quit退出!\n");
    while(1)
    {
        // STDIN_FILENO表示标准输入
        write(STDOUT_FILENO,"yoursql>",8);
    memset(rSql,0x00,sizeof(rSql));
        // 标准输出 STDOUT_FILENO
        read(STDIN_FILENO,rSql,sizeof(rSql));//读入sql
        if(strncmp(rSql,"quit",4) == 0){
      printf("bye bye!欢迎下次使用!\n");
      break;
    }
        //执行sql
    if(mysql_query(mysql,rSql) != 0){
        printf("mysql_query err\n");
        continue;
      }
           //取回结果集
      int i=0;
      MYSQL_RES * result = mysql_store_result(mysql);
      MYSQL_ROW row;
      if(result != NULL){
        //需要打印结果集
        show_result(result,mysql);
      mysql_free_result(result);//释放结果集
      }else
        {
        //输出例如:Query OK, 1 row affected (0.16 sec)
        printf("Query OK, %ld row affected \n",mysql_affected_rows(mysql));
        //printf("%ld products updated",(long) mysql_affected_rows(&mysql));
      }
    }
    // 最后关闭连接
    mysql_close(mysql);
    return 0;
}



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
39 9
|
7天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
23 3
|
7天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
20 3
|
11天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
37 3
|
17天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
15天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
77 1
|
17天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
63 3
|
21天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
18天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
38 1
|
1月前
|
Ubuntu 关系型数据库 MySQL
Linux系统MySQL安装
【10月更文挑战第19天】本文介绍了在 Linux 系统上安装 MySQL 的步骤,包括安装前准备、安装 MySQL、启动 MySQL 服务、配置 MySQL 以及验证安装。适用于 Ubuntu/Debian 和 CentOS/Fedora 系统,提供了详细的命令示例。
149 1