7. 数据库MySQL

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 7. 数据库MySQL

本文介绍了数据库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'@'%';


4、vsCode无法连接数据库Error: ER_NOT_SUPPORTED_AUTH_MODE

原因:登录数据库的客户端跟mysql8.0不兼容了,mysql8.0密码认证采用了新的密码格式

解决办法:mysql终端输入下面命令

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';


root、password 分别为数据库账户,密码

二、使用

安装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

先看一下关键函数

1、MYSQL mysql:定义一个MYSQL类型的结构体变量,并通过调用mysql_init()函数对其进行初始化,调用mysql_error()函数来获取有关错误信息

2、mysql_real_connect():用于连接到MySQL服务器,返回0,不成功。

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 client_flag);

1)mysql:一个指向 MYSQL 结构体的指针,用于存储连接的句柄。该结构体已由mysql_init()初始化。

2)host:MySQL 服务器的主机名或 IP 地址。

3)user:连接 MySQL 服务器所使用的用户名。

4)passwd:连接 MySQL 服务器所使用的密码。5)db:要连接的数据库名称。

6)port:MySQL 服务器的端口号。

7)unix_socket:UNIX 域套接字的路径。如果使用 TCP/IP 连接,则设置为 NULL。

8)client_flag:客户端标志位,用于设置连接选项和功能。

3、mysql_real_query():用于向MySQL服务器发送SQL查询或更新语句,返回非0,表示不成功。

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);

1)mysql:一个指向 MYSQL 结构体的指针,表示已经建立的数据库连接。

2)query:要执行的 SQL 查询或命令的字符串。

3)length:查询或命令字符串的长度。如果设置为 0,则函数会自动计算字符串的长度。


4、mysql_store_result(&mysql):用于从上一次查询中检索所有结果集。当您使用SELECT语句从数据库检索数据时,结果将返回到客户端,并存储在MYSQL_RES结构中。使用mysql_store_result():函数将整个结果集存储在内存中,并返回一个指向此结果集的MYSQL_RES*指针。这使得我们可以轻松地遍历和操作结果集。

MYSQL_RES *mysql_store_result(MYSQL *mysql);

mysql:一个已经通过mysql_real_connect()函数连接到MySQL服务器的MYSQL对象指针。

5、mysql_num_rows()用于获取查询结果集中行的数量。

unsigned long mysql_num_rows(MYSQL_RES *result);

6、 mysql_fetch_row():用于从查询结果集中逐行获取数据

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

result:一个指向MYSQL_RES结构的指针,该结构包含了查询结果集的详细信息。


需要注意的是,mysql_fetch_row()函数只返回一行数据,并且每次调用该函数会将结果集游标移动到下一行。因此,在遍历结果集时需要在循环中多次调用mysql_fetch_row()函数来获取所有行的数据。while ((row=mysql_fetch_row(res))):在这个循环中,每一次mysql_fetch_row()都获得当前行数据库,并赋值给数组row,然后自动滑向下一行;在取出最后一行后,函数将返回false,循环结束。就可以把结果集中的所有数据逐行取出并显示。

7、 mysql_num_fields:用于获取查询结果集中的字段数目(列数)。

unsigned int mysql_num_fields(MYSQL_RES *result);

8、mysql_fetch_fields:用于获取结果集中的字段信息。它可以返回一个数组,包含每个字段的详细信息。

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);

参数 result 是一个指向已经执行完查询并获取到结果集的 MYSQL_RES 结构体的指针。


该函数返回一个指向 MYSQL_FIELD 结构体数组的指针,数组的每个元素代表结果集中的一个字段。MYSQL_FIELD 结构体定义了字段的各种属性,例如字段名、字段类型、字段长度、字段标志等。


以下是 MYSQL_FIELD 结构体的常见字段:

char *name:字段名。

char *org_name:原始字段名。

int name_length:字段名长度。

unsigned long length:字段值的最大长度。

enum enum_field_types type:字段类型(例如,字符串、整数等)。

unsigned int flags:字段的标志。

unsigned int decimals:对于浮点数类型的字段,小数点后的位数。


四、流程

  1. 通过mysql_init()函数初始化MYSQL对象。
  2. 使用mysql_real_connect()函数连接到MySQL服务器。
  3. 执行SQL查询语句,例如通过mysql_query()函数发送查询给服务器。
  4. 调用mysql_store_result()函数以将查询结果存储在客户端内存中。
  5. 使用mysql_fetch_row()、mysql_fetch_array()或其他类似函数逐行获取结果集中的数据。
  6. 使用完结果集后,使用mysql_free_result()函数释放结果集所占用的内存。
#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;
}


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
145 3
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
3月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
152 1
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
4月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
3月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
417 7

热门文章

最新文章

推荐镜像

更多