7. 数据库MySQL

news2024/12/26 21:30:33

本文介绍了数据库mysql的安装配置过程,以及通过VsCode调用数据库实现一些功能

一、安装

如果之前安装过,或者安装失败。清除MySQL缓存并重新安装:运行以下命令以清除所有MySQL缓存文件,并重新安装它们

sudo apt-get remove --purge mysql-server mysql-client mysql-common
sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
sudo dpkg --configure -a
sudo apt-get update
sudo apt-get install mysql-server-5.7

接下来配置mysql允许远程连接。
MySQL默认只允许本地登录,如果要开启远程连接需要修改MySQL配置文件

1、修改mysqld.cnf配置文件

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

打开之后修改bind-address地址为0.0.0.0
在这里插入图片描述
之后重启

sudo /etc/init.d/mysql restart

2、创建远程登录的用户

mysql -u root -p
show databases;
use mysql;
show tables;
select Host,User from user where User='root';

在这里插入图片描述
创建admin用户,并指定该用户可以从任何主机(% 代表通配符,表示所有主机)连接到 MySQL 数据库服务器

create user 'admin'@'%' identified by '123456';
select Host,User from user;

在这里插入图片描述

3、为需要远程登录的用户赋予权限

允许任何ip地址(%表示允许任何ip地址)的电脑用admin帐户和密码(123456)来访问这个mysql server。

grant all privileges on *.* to 'admin'@'%';

二、使用

安装MySQLWorkbench,即可通过SQL操作数据库

create database MING_DB;  #创建数据库
# drop database MING_DB;	#删除数据库
show databases;
use MING_DB;	#使用数据库
create table TBL_USER(	#创建TBL_USER表
U_ID int primary key auto_increment,
U_NAME varchar(32),
U_GENDER	varchar(32)
);
show tables;	#使用table

在这里插入图片描述

三、

为了通过vscode等开工具来使用数据库,需要安装mysql开发工具

sudo apt-get install libmysqlclient-dev

接下来实现数据的数据插入、查询、删除、存储。
注意对于删除,mysql一般只允许对主键删除,即delete from TBL_USER where U_ID='2';
若要对于针对其他标签的删除,可利用一个存储过程。

#sql
DELIMITER $$
create procedure PROC_DELETE_USER(in UNAME varchar(32))
BEGIN
set sql_safe_updates=0;
delete from TBL_USER where U_NAME=UNAME;
set sql_safe_updates=1;
END$$
CALL PROC_DELETE_USER('qin');

这段 MySQL 代码定义了一个名为 PROC_DELETE_USER 的存储过程,该存储过程接收一个参数 UNAME,用于指定要删除的用户的用户名。该存储过程执行以下操作:

  • 将 SQL 安全更新设置为 0,以便允许执行不安全的 DELETE 操作。
  • 删除 TBL_USER 表中 U_NAME 字段值等于传递给存储过程的参数 UNAME 的记录。
  • 将 SQL 安全更新设置回 1,以便禁止执行不安全的 SQL 语句。
  • 最后一行代码是调用该存储过程,并将字符串 ‘qin’ 作为参数传递给它。也就是说,该代码将会删除 TBL_USER 表中 U_NAME 字段值为 ‘qin’ 的记录。

最后编译指令为gcc -o mysql mysql.c -I/usr/include/mysql/ -lmysqlclient
先看一下关键函数

  • MYSQL mysql:定义一个MYSQL类型的结构体变量,并通过调用mysql_init()函数对其进行初始化,调用mysql_error()函数来获取有关错误信息
  • mysql_real_connect():用于连接到MySQL服务器,返回0,不成功。它需要以下参数:
    1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。
    2、MySQL服务器所在主机名或IP地址。
    3、登录MySQL服务器时使用的用户名。
    4、登录MySQL服务器时使用的密码。
    5、要连接的数据库名称。
    6、端口号(默认为3306)。
    7、规定 socket 8、规定不同的连接选项
  • mysql_real_query():用于向MySQL服务器发送SQL查询或更新语句,返回非0,表示不成功。它需要以下参数:
    1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。
    2、要执行的SQL查询或更新语句。
    3、SQL查询或更新语句的长度(如果为0,则将自动计算)。
  • MYSQL_RES *res=mysql_store_result(&mysql):用于从上一次查询中检索所有结果集。当您使用SELECT语句从数据库检索数据时,结果将返回到客户端,并存储在MYSQL_RES结构中。使用mysql_store_result():函数将整个结果集存储在内存中,并返回一个指向此结果集的MYSQL_RES*指针。这使得我们可以轻松地遍历和操作结果集。
  • int rows=mysql_num_rows(res)用于获取查询结果集中行的数量。
  • mysql_fetch_row():用于从查询结果集中获取下一行数据。
  • int rows=mysql_num_rows(res):用于获取查询结果集中行的数量
  • mysql_fetch_row():用于从查询结果集中获取下一行数据
#include<stdio.h>
#include<string.h>
#include <mysql.h>

#define MING_DB_IP           "192.168.42.128"
#define MING_DB_PORT         3306
#define MING_DB_USENAME      "admin"
#define MING_DB_PASSWORD     "123456"
#define MING_DB_DEFAULTDB    "MING_DB"

#define SQL_INSERT_TRL_USER     "insert TBL_USER(U_NAME,U_GENDER) values('zxm','women');"
#define SQL_SELECT_TBL_USER     "select * from TBL_USER;"
#define SQL_DELETE_TBL_USER     "CALL PROC_DELETE_USER('zxm')"
//查询
int ming_mysql_select(MYSQL *handle){
    //发送sql语句-->select
    if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){
        //不等于0,不成功
        printf("mysql_real_query:%s\n",mysql_error(handle));
        return -1;
    }

    //存储结果
        //mysql_store_result()用于从上一次查询中检索所有结果集
    MYSQL_RES *res=mysql_store_result(handle);
    if (res==NULL){
        printf("mysql_store_result:%s\n",mysql_error(handle));
        return -2;
    }

    //判断结果行数和列数
        //mysql_num_rows()用于获取查询结果集中行的数量
    int rows=mysql_num_rows(res);
    printf("rows:%d\n",rows);

    int fields=mysql_num_fields(res);
    printf("fields:%d\n",fields);

    //抓取数据
    MYSQL_ROW row;
        //mysql_fetch_row()用于从查询结果集中获取下一行数据
    while ((row=mysql_fetch_row(res))){
        int i=0;
        for (i=0;i<fields;i++){
            printf("%s\t",row[i]);
        }
        printf("\n");
    }


    mysql_free_result(res);

    return 0;
}

int main(){

    //定义一个MYSQL类型的结构体变量,并通过调用mysql_init()函数对其进行初始化
    //调用mysql_error()函数来获取有关错误信息
     MYSQL mysql;
    
    if (mysql_init(&mysql)==NULL){
        printf("mysql_init:%s\n",mysql_error(&mysql));
        return -1;
    }

    //mysql_real_connect()用于连接到MySQL服务器.它需要以下参数:
    /*1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。
      2、MySQL服务器所在主机名或IP地址。
      3、登录MySQL服务器时使用的用户名。
      4、登录MySQL服务器时使用的密码。
      5、要连接的数据库名称。
      6、端口号(默认为3306)。
      7、规定 socket    8、规定不同的连接选项
    */
    if(!mysql_real_connect(&mysql,MING_DB_IP,MING_DB_USENAME,MING_DB_PASSWORD,
    MING_DB_DEFAULTDB,MING_DB_PORT,NULL,0)){    //等于0,不成功
        printf("mysql_real_connect:%s\n",mysql_error(&mysql));
        return -2;
    }


    printf("case:mysql insert \n");
#if 1
    /*mysql_real_query()用于向MySQL服务器发送SQL查询或更新语句。它需要以下参数:
      1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。
      2、要执行的SQL查询或更新语句。
      3、SQL查询或更新语句的长度(如果为0,则将自动计算)。
    */
    if(mysql_real_query(&mysql,SQL_INSERT_TRL_USER,strlen(SQL_INSERT_TRL_USER))){
        //不等于0,不成功
        printf("mysql_real_query:%s\n",mysql_error(&mysql));
        return -3;
    }

#endif

    //输出表的结果
    ming_mysql_select(&mysql);

    printf("case:mysql delete \n");
#if 1
    /*mysql_real_query()用于向MySQL服务器发送SQL查询或更新语句。它需要以下参数:
      1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。
      2、要执行的SQL查询或更新语句。
      3、SQL查询或更新语句的长度(如果为0,则将自动计算)。
    */
    if(mysql_real_query(&mysql,SQL_DELETE_TBL_USER,strlen(SQL_DELETE_TBL_USER))){
        //不等于0,不成功
        printf("mysql_real_query:%s\n",mysql_error(&mysql));
        return -3;
    }

#endif

    //输出表的结果
    ming_mysql_select(&mysql);

    //关闭
    mysql_close(&mysql);

    return 0;

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA基础(各种类)

Object类 1、Object类中有许多方法是用native修饰的&#xff0c;这些方法是本地方法&#xff0c;用C语言实现。 2、Object类的一些方法&#xff1a; clone()方法&#xff1a;需要继承Clonable接口&#xff0c;并覆写clone()&#xff0c;修改为public权限&#xff0c;原来为p…

Halcon中从两组点的对应关系生成仿射矩阵,及思考原理和代码实现

有几个算子有点类似&#xff0c;看了下区别 1.vector_to_rigid( : : Px, Py, Qx, Qy : HomMat2D) 2.vector_to_similarity( : : Px, Py, Qx, Qy : HomMat2D) 3.vector_to_aniso( : : Px, Py, Qx, Qy : HomMat2D) vector_to_rigid 这个是刚性变换&#xff0c; 只有旋转和平移…

参考企业微信日程 通过vue+elementUi编写一个按月统计会议的日程计划组件

这个组件的话 需要三个第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader element-uisass因为我这里 还是习惯写sass样式 毕竟真的方便啊 chinese-lunar-calendar 是一款将日期转为农历的工具 element-ui主要是表格真的方便 在 项目src下的main.js入口…

如何学好人工智能?

“在主流的视频直播教学之外&#xff0c;直接与老师在课件上互动能够更快地让我进入学习状态。” 大家的时间都很宝贵&#xff0c;当我们好不容易下定决心要学习一门新知识时&#xff0c;各种影响学习的噪声会在本不富裕的耐心上大打折扣&#xff0c;万事开头难变成了真理。特别…

[技术分享]Android平台实时音视频录像模块设计之道

实现背景 录像有什么难的&#xff1f;无非就是数据过来&#xff0c;编码保存mp4而已&#xff0c;这可能是好多开发者在做录像模块的时候的思考输出。是的&#xff0c;确实不难&#xff0c;但是做好&#xff0c;或者和其他模块有非常好的逻辑配合&#xff0c;确实不容易。 好多…

考研复试第十六天:合并果子 【哈佛曼树】

前置知识 哈佛曼树&#xff1a;我们先来复习一下啥叫做哈佛曼树 1.背景 我们有下面这样一个字符串需要编码&#xff0c;就是将下面的字符转为二进制。我们采用的方法是前缀编码&#xff0c;用一颗树的叶节点来放字符。 2.前缀编码 编码是咋样的呢&#xff1f;看下面这个例子…

BurpSuite—Project options模块(项目选择)

本文主要BurpSuite—Project options模块(项目选择)介绍的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt 一、简介 Project options主要用来对Project的一些设置。 二、模块说明 Project options主要由五个模块组成: 1.Connect…

Zabbix“专家坐诊”第192期问答汇总

问题一 Q&#xff1a;请问下&#xff0c;客户机snmptrap发告警为啥server web收不到&#xff0c;关键是snmptrap日志已经收到&#xff0c;zabbix server配置以及开启snmptrap1 snmptrapvar log snmptrap snmptrap.log&#xff1f; A&#xff1a;有配置trap的监控项吗&#xff…

Install ELK+Filebeat on Kubernetes Cluster with Helm

目录 Node & Software & Docker Images Lists Prerequisites Install ELK Manually Deploying ElasticSearch Create deployment Expose deployment Deploying Kibana Create deployment Accessing the Kibana UI Deploying Logstash Create ConfigMap and…

快手上市后首次盈利,直播电商业务成造血利器

5月22日盘前&#xff0c;快手业绩还没有发布&#xff0c;股价却先涨为敬&#xff0c;中信证券、彭博、中金公司等多家机构给出超预期业绩的预测。盘后公布的业绩确实超过市场的一致预期&#xff0c;市场在今天也给出正面回应&#xff0c;股价再次上扬&#xff0c;最高点达57.10…

revit窗族的平面出图设置,revit快速创建幕墙

一、revit窗族的平面出图设置 在平面视图中&#xff0c;为了满足出图的需要&#xff0c;我们经常要修改在不同的详细程度的可见性设置。 例如我们的窗在没有进行设置时在粗略/中等/精细的详细程度中都可以看到清晰的窗体构件。那么要使窗在精细程度中才可以看见详细的窗体结构&…

Sentinel如何实现对分布式系统的高可用性和流量控制?我们通过源码一起学习

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍Sentinel源码实现对分布式系统高可用性和流量控制&#xff0c;后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教…

蓝桥杯单片机DS18b20单总线测温模块常见问题解决

蓝桥杯单片机DS18b20单总线测温模块常见问题解决 有道是&#xff1a;“溪水声声留我住&#xff0c;梅花朵朵唤人回” DS18b20测温模块作为一个比较简单、稳定的蓝桥杯单片机外设模块&#xff0c; 使用时却经常出现各种问题&#xff0c;总是让我们不禁三番多次回顾其基础知识…

再获认可!腾讯连续三年被Gartner列为CWPP供应商之一

随着云的快速发展&#xff0c;企业的工作负载已经从服务器发展到虚拟机、容器、serverless等&#xff0c;部署的模式也日益复杂&#xff0c;包括公有云、混合云和多云等。在此背景下&#xff0c;传统的主机安全防护已无法满足需求&#xff0c;CWPP&#xff08;云工作负载保护平…

飞鹤乳业携手用友,重塑财务价值,开创财务共享服务新局面

在这个数字化时代&#xff0c;企业需要不断地面对各种变革和挑战&#xff0c;而数字化财务共享服务正是帮助企业应对挑战和实现数字化转型的有效手段之一。飞鹤乳业携手用友&#xff0c;以数字化财务共享服务平台为契机&#xff0c;旨在整合财务资源&#xff0c;优化财务流程&a…

小白必看!数据库自学入门教程,免费的SQL认证课程

在数据库国产化浪潮下&#xff0c;你是否想尽快更新你的知识体系&#xff1f;好程序员整理了免费的SQL认证教程&#xff0c;方便大家按需选择学习&#xff0c;证明自己的实力&#xff0c;获得更多职场机会&#xff01; 1.SQL数据分析- Udacity 2.SQL入i]- Codecademy 3.SQL Ser…

从零实现一个数据库(DataBase) Go语言实现版 4.B树实现(Part1))

英文源地址 本章将使用Go语言实现一个不可变地B树.这是一个最小实现, 因此很容易理解. Node节点的格式 我们的B树最终将被持久化到磁盘上, 因此我们首先需要为b树节点设计数据格式.如果没有这种格式, 我们将无法知道节点的大小以及何时拆分节点. 一个节点包含: 一个固定大小…

Bug可以说是一种缺陷吗?

我叫缺陷&#xff0c;从被创建至关闭&#xff0c;到最后做缺陷分析&#xff0c;这是我的完整生命周期。我的整个生命周期贯穿着整个项目的项目周期&#xff0c;因此&#xff0c;掌握我的生命周期&#xff0c;不止是测试人员必修的课程&#xff0c;也是测试人员的灵魂。 缺陷的…

Android 动态加载资源

资源文件分类 1.android资源文件分为两类&#xff1a; 第一类是res目录下存放的可编译资源文件&#xff0c;编译时&#xff0c;系统会自动在R.java中生成资源文件的十六进制值&#xff0c;如下所示&#xff1a; public final class R {public static final class id {public …

从注解@EventListener和@TransactionalEventListener掌握Spring的事件机制原理

文章目录 Spring事件监听机制Spring事件监听机制概述Spring事件监听机制介绍Spring事件相关的几个类使用硬编码简单还原Spring事件机制 Spring事件机制正确的使用方式Spring事件创建Spring事件发布方式Spring事件监听方式面向接口的方式面向注解的方式EventListenerTransaction…