网站开发学什么数据库/杭州旺道企业服务有限公司

网站开发学什么数据库,杭州旺道企业服务有限公司,美食网站策划书,做视频编辑哪个网站素材比较好目录 一、前言 二、安装VMware运行Ubuntu 1.安装VMware 2.使用VMware打开Ubuntu 三、配置VMware使用网卡 1.添加NAT网卡 四、Linux下安装MySQL数据库 五、安装MySQL开发库 六、演示代码 sql_connect.c sql_connect.h main.c中数据库相关代码 结尾 一、前言 由于最…

目录

一、前言

二、安装VMware运行Ubuntu

1.安装VMware

2.使用VMware打开Ubuntu

三、配置VMware使用网卡

1.添加NAT网卡

四、Linux下安装MySQL数据库

五、安装MySQL开发库

六、演示代码

sql_connect.c

sql_connect.h

main.c中数据库相关代码

结尾


一、前言

        由于最近在做项目,需要用到数据库,想在Linux服务端使用C语言操作MySQL数据库,于是写一篇博客记录一下。希望大伙点个关注支持一下,不久后就更新项目博客。


二、安装VMware运行Ubuntu

1.安装VMware

        Windows 下有很多虚拟机软件,目前市面上流行的有VMware和VirtualBox。VMware 分为收费专业版 Workstation Pro 和非商用免费版 Workstation Player,推荐使用Workstation Player

        我使用的是韦东山老师提供的 Ubuntu 镜像文件,链接:Linux虚拟机环境 。VMWare 安装软件是:VMware-workstation-full-16.2.3-19376536.exe。下面给出VMWare的安装步骤。

第1步:以管理员身份运行安装软件:

第2步:点击“下一步”:

第3步:勾选“我接受”点击“下一步”:

第4步:指定安装目录后点击“下一步”:

第5步:设置用户体验后点击“下一步”:

第6步:设置快捷方式后点击“下一步”:

第7步:点击“安装”开始安装:

第8步:等待安装完成:

第9步:完成安装:

        VMWare 安装完成后,有两个软件,它们都可以使用,建议使用第2个:
        ① Vmware Workstation Pro:这是收费的,可以试用30天。
        ② Vmware Workstation 16 Player:这是免费的。

2.使用VMware打开Ubuntu

        解压Ubuntu镜像压缩包后,可以得到如图所示文件:

注意:在打开之前,请先确保您的电脑的BIOS已经启动了虚拟化,可以打开设备管理器确认这点,如图所示:

        然后查看是否启动了虚拟化:

        确认打开后,就可以使用VMware打开Ubuntu镜像了:

第1步:以管理员身份打开Vmware Workstation 16 player:

第2步:打开虚拟机,使用vmware打开前面解压得到的“Ubuntu 18.04_x64.vmx”:

第3步:播放虚拟机:

第4步:第一次启动Ubuntu时,选择默认的“我已复制该虚拟机”,启动后输入密码“123456”回车即可登录:

注意:虚拟机默认没有开启小键盘,如果使用小键盘输入,请先开启小键盘


三、配置VMware使用网卡

1.添加NAT网卡

        使用韦东山老师团队制作的Ubuntu映像时,它已经添加了NAT网卡,无需再添加NAT网卡。如果你的Ubuntu虚拟机中没有NAT网卡,则可以如图所示添加NAT网卡:

① 点击进入“编辑虚拟机设置”;
② 如果没有NAT模式的网卡,则继续下一步;
③ 点击“添加”;
④ 选择“网络适配器”;
⑤ 点击“完成”;
⑥ 设置新添加的“网络适配器”的“网络连接”为“NAT模式”;
⑦ 点击确定完成NAT网卡的添加;

        添加NAT网卡后,可以启动Ubuntu,使用 ifconfig 命令查看IP,再使用 ping 命令确认可以连接外网:

        至此前期的准备工作就结束了!下面准备安装MySQL数据库。


四、Linux下安装MySQL数据库

        直接在终端按顺序输入以下命令即可:

sudo apt install mysql-server

        输入这个之后会让我们输入密码,也是123456。然后会问我们是否确定安装,输入Y即可。

        安装完之后会自动启动MySQL服务,使用下面的命令来查看服务状态:

systemctl status mysql

        看到显示 active 就表示服务已经启动成功了:

        如果没有启动的可以执行下面命令来启动:

systemctl start mysql 

        然后输入密码即可。

        接着我们来修改一下密码,这个密码是进入MySQL数据库的密码,不是Ubuntu的登陆密码,不要搞混了,以后我们使用MySQL开发库,通过C语言来操作数据库,肯定需要传入密码和IP等参数,我们现在就来修改这个密码。

        Linux系统安装完之后默认是有密码的,如果输入的密码错误,当然也就无法连接到MySQL的服务,输入以下命令可以找到默认的密码:

sudo cat /etc/mysql/debian.cnf 

        通过这个命令可以找到这个位置上的配置文件,它里面就记载了一个默认的用户名和密码,那我们就可以使用这个用户名和密码来连接MySQL的服务,输入命令如下:

mysql -u debian-sys-maint -p m6mhClGDw71Ko2yS 

        -u 后面是你的用户名,-p后面是密码,回车后就能连接到MySQL服务了。但是这个用户名和密码都不太好记,现在我们来修改密码和用户名,我们输入了上面那行命令后,已经连接到了MySQL服务,然后输入下面的语句修改:

alter user 'root'@'%' identified with mysql_native_password by '123456'; 

        如果出错的话就把%改成localhost,修改成功后执行下面的语句刷新权限:

flush privileges; 

        之后就可以输入 mysql -u root -p ,然后输入密码 123456 连接MySQL服务了,退出MySQL服务到终端的语句为 exit;


五、安装MySQL开发库

        我们要安装 libmysqlclient-dev 开发库,这个lib库是Linux下使用C/C++连接MySQL的客户端,安装步骤如下:

        更新软件源:

sudo apt update

        然后直接下载:

sudo apt install libmysqlclient-dev 

        这样我们就可以编写C语言来操作数据库了,详细内容可以看这个博主的博客,还是十分详细的:Linux(程序设计):18---libmysqlclient-dev库(C语言操作MySQL)-CSDN博客 。

        注意:编译的时候需要指定头文件路径以及链接mysqlclient库,如下:

gcc demo.c -o demo -I/usr/include/mysql -lmysqlclient


六、演示代码

        由于我对数据库也不是很了解,只学了点皮毛,项目中只用到了数据的插入、修改、删除和查询(如果你也是想用C语言对数据库进行简单操作,你可以参考我的代码),下面直接给出我用的代码给大家参考,我会说明功能和用法:

sql_connect.c

#include "sql_connect.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 初始化数据库连接对象
SQLifconfig* SQLifconfig_init() {SQLifconfig *config = (SQLifconfig*)malloc(sizeof(SQLifconfig));if (!config) return NULL;// 初始化成员变量config->mysql = NULL;config->row = NULL;config->result = NULL;// 初始化 MySQL 连接config->mysql = mysql_init(NULL);if (!config->mysql) {printf("Init Error: %s\n", mysql_error(config->mysql));free(config);return NULL;}// 强制设置字符集if (mysql_options(config->mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4")) {printf("Set UTF-8 Error: %s\n", mysql_error(config->mysql));mysql_close(config->mysql);free(config);return NULL;}return config;
}// 释放数据库连接对象
void SQLifconfig_destroy(SQLifconfig *config) {if (config) {if (config->mysql) {mysql_close(config->mysql);}free(config);}
}// 初始化数据库连接
bool SQLifconfig_SQL_init(SQLifconfig *config, const char *host, const char *user, const char *pwd, const char *dbname) {if (!mysql_real_connect(config->mysql, host, user, pwd, dbname, 3306, NULL, 0)) {printf("connect error: %s\n", mysql_error(config->mysql));return false;}return true;
}// 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
bool SQLifconfig_Dml_sql(SQLifconfig *config, const char *sqlstr) {printf("sql: %s\n", sqlstr);// 开始事务if (mysql_query(config->mysql, "BEGIN")) {printf("query_error: %s\n", mysql_error(config->mysql));return false;}// 执行 SQL 语句if (mysql_query(config->mysql, sqlstr)) {printf("query_error: %s\n", mysql_error(config->mysql));return false;}// 提交事务if (mysql_query(config->mysql, "COMMIT")) {printf("query_error: %s\n", mysql_error(config->mysql));return false;}return true;
}// 执行查询 SQL 语句(SELECT)
char* SQLifconfig_Dql_sql(SQLifconfig *config, const char *sqlstr) {// 执行 SQL 查询if (mysql_query(config->mysql, sqlstr)) {printf("query_error: %s\n", mysql_error(config->mysql));return NULL;}// 获取查询结果集config->result = mysql_store_result(config->mysql);if (!config->result) {return NULL; // 无结果或错误}// 获取字段数量int fieldnum = mysql_num_fields(config->result);// 初始化动态缓冲区size_t total_len = 1024; // 初始缓冲区大小char *buffer = (char*)malloc(total_len);if (!buffer) {mysql_free_result(config->result);return NULL; // 内存分配失败}buffer[0] = '\0'; // 初始化空字符串// 遍历结果集的每一行while ((config->row = mysql_fetch_row(config->result))) {// 计算当前行所需的总长度size_t row_len = 0;for (int j = 0; j < fieldnum; j++) {row_len += strlen(config->row[j] ? config->row[j] : "NULL") + 1; // 字段值 + 分隔符}// 动态扩展缓冲区(如果当前缓冲区不足以容纳新行)size_t current_len = strlen(buffer);if (current_len + row_len + 2 > total_len) {total_len += row_len + 2; // 扩展缓冲区大小char *new_buf = realloc(buffer, total_len);if (!new_buf) {free(buffer);mysql_free_result(config->result);return NULL; // 内存分配失败}buffer = new_buf;}// 拼接当前行的字段值for (int j = 0; j < fieldnum; j++) {const char *val = config->row[j] ? config->row[j] : "NULL"; // 处理 NULL 值strcat(buffer, val); // 追加字段值strcat(buffer, "#"); // 追加分隔符}buffer[strlen(buffer)-1] = '\n'; // 将最后一个#替换为换行符}// 释放结果集内存mysql_free_result(config->result);// 检查是否有有效数据if (strlen(buffer) == 0) {free(buffer);return NULL; // 无数据}// 返回格式化后的字符串return buffer;
}

sql_connect.h

#ifndef __SQL_CONNECT_H
#define __SQL_CONNECT_H#include <mysql.h>
#include <stdbool.h>// 数据库连接结构体
typedef struct {MYSQL *mysql;       // MySQL 连接对象MYSQL_ROW row;      // 当前行数据MYSQL_RES *result;  // 查询结果集
} SQLifconfig;// 初始化数据库连接
SQLifconfig* SQLifconfig_init();// 释放数据库连接
void SQLifconfig_destroy(SQLifconfig *config);// 初始化数据库连接
bool SQLifconfig_SQL_init(SQLifconfig *config, const char *host, const char *user, const char *pwd, const char *dbname);// 执行查询 SQL 语句(SELECT)
char* SQLifconfig_Dql_sql(SQLifconfig *config, const char *sqlstr);// 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
bool SQLifconfig_Dml_sql(SQLifconfig *config, const char *sqlstr);#endif

main.c中数据库相关代码

/*--------------------------*/
/*数据库初始化相关操作*/
// 初始化数据库连接对象
SQLifconfig *MySQL_Handler = SQLifconfig_init();
if (!MySQL_Handler) 
{printf("初始化数据库失败\n");return -1;
}
// 连接数据库
if (!SQLifconfig_SQL_init(MySQL_Handler, "127.0.0.1", "root", "123456", "testdatabase")) 
{printf("连接数据库失败\n");SQLifconfig_destroy(MySQL_Handler);return -1;
}
/*--------------------------*//*--------------------------*/
/*查询数据示例操作*/
char buf[100];
// 构造 SQL 查询语句
sprintf(buf, "select * from table where id='%s'", str);char *result = SQLifconfig_Dql_sql(MySQL_handler, buf);
if(result)
{printf("查询到的数据:%s\n", buf);free(result); // 必须手动释放内存
}
//失败的话会返回NULL,同时在函数内部已经释放了内存,因此失败的分支不需要我们手动释放了
else
{write(customer->client_socket, "4\n", 2);
}
/*--------------------------*//*--------------------------*/
/*修改数据示例操作*/
char buf[100] = {0};
// 构造 SQL 删除语句,删除table表中id为AABBCCDD的一行数据
sprintf(buf, "DELETE FROM table WHERE id='%s'", "AABBCCDD");// 执行 SQL 删除操作
int result = SQLifconfig_Dml_sql(MySQL_handler, buf);
if(result)
{//成功
}
else
{//失败
}
/*--------------------------*/

        其实就是自己构造MySQL语句,可以去看看一些常用的语句,还是比较简单的,Dql函数会返回查询到的数据,每个字段都会用 # 分隔,每一行的数据最后还会加上 \n 换行符,比如说我要查询table中的所有数据,返回值如下:

id#name#level
id2#name2#level2

        注意这里的每一行的末尾都会有换行符'\n',其中需要注意的是,如果你想查询表里的某一行数据的某个字段,如果这个位置你还没有写过数据,读出来的值是"NULL\n"字符串,并不是NULL,只有查询失败才会返回 NULL,可以仔细看一下我的代码。


结尾

        分享到此结束了,后面我会更新Linux下C语言编写的服务端+Qt管理员端+Qt用户端+STM32用户端实现的无人超市项目,也是成功复刻了一个大佬的项目,学到了很多东西,希望大家点个关注支持一下。

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

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

相关文章

常见中间件漏洞之一 ----【Tomcat】

中间件Tomcat介绍&#xff1a; tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露…

javaweb自用笔记:Mybatis

目录 mybatis 配置sql书写提示 JDBC 数据库连接池 lombok mybatis 只需要定义Mapper接口就好&#xff0c;不需要有实现类&#xff0c;因为框架底层会自动生成实现类 配置sql书写提示 JDBC 数据库连接池 lombok XML映射文件 动态SQL

比手动备份快 Iperius全自动加密备份,NAS/云盘/磁带机全兼容

IperiusBackupFull是一款专为服务器和工作站设计的备份解决方案&#xff0c;它同时也是一款针对Windows 7/8/10/11/Server系统的简洁且可靠的备份软件。该软件支持增量备份、数据同步以及驱动器镜像&#xff0c;确保能够实现完全的系统恢复。在备份存储方面&#xff0c;Iperius…

mapbox进阶,添加鹰眼图控件

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️mapboxgl-minimap 鹰眼控件二、🍀添加…

亮数据爬取API爬取亚马逊电商平台实战教程

前言 在当今数据驱动的商业环境中&#xff0c;企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而&#xff0c;传统的手动网页爬取方式面临着诸多挑战&#xff1a;IP封锁、验证码干扰、网站结构频繁变更&#xff0c;以及高昂的运维成本…

“城市超级智能体”落地,联想智慧城市4.0“功到自然成”

作者 | 曾响铃 文 | 响铃说 交通摄像头捕捉到车流量数据&#xff0c;进入一套“自动化”的城市整体管理体系中&#xff0c;交通路况信息、天气变化情况以及城市大型活动安排等看似分散的数据被整合&#xff0c;根据预测的路况精准调控交通信号灯&#xff0c;让自动驾驶清扫车…

计算机复试面试

数据库 1.设计过程/设计步骤 1.需求分析&#xff1a;明确客户需求&#xff0c;确定系统边界&#xff0c;生成数据字典 2.概念结构设计&#xff1a;将用户需求抽象为概念模型&#xff0c;绘制e-r图 3.逻辑结构设计&#xff1a;将e-r图转化为dbms相符合的逻辑结构&#xff0c;db…

模型 拆屋效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。先过分后合理&#xff0c;易被接受。 1 拆屋效应的应用 1.1 高端手表销售案例 一、案例背景 在高端手表销售领域&#xff0c;销售人员面临顾客对价格敏感且购买决策谨慎的挑战。如何引导顾客接受较高…

Windows系统下Pycharm+Minianaconda3连接教程【成功】

0.引言 PycharmMinianaconda3开发组合的好处 优点类别具体优点描述环境管理便捷独立环境创建 环境复制与共享Miniconda3可创建多独立Python环境&#xff0c;支持不同版本与依赖&#xff0c;避免冲突。 能复制、分享环境配置&#xff0c;方便团队搭建相同开发环境。依赖管理高…

python每日十题(10)

在Python语言中&#xff0c;源文件的扩展名&#xff08;后缀名&#xff09;一般使用.py。 保留字&#xff0c;也称关键字&#xff0c;是指被编程语言内部定义并保留使用的标识符。Python 3.x有35个关键字&#xff0c;分别为&#xff1a;and&#xff0c;as&#xff0c;assert&am…

Clio:具备锁定、用户认证和审计追踪功能的实时日志记录工具

在网络安全工具不断发展的背景下&#xff0c;Clio 作为一款革命性的实时日志记录解决方案&#xff0c;由 CyberLock Technologies 的网络安全工程师开发&#xff0c;于 2025 年 1 月正式发布。这款先进的工具通过提供对系统事件的全面可见性&#xff0c;同时保持强大的安全协议…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理&#xff08;NLP&#xff09;领域的核心地位及其发展历程&#xff0c;从基础概念出发&#xff0c;延伸至语言模型在机器翻…

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程)

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程) 一、获取网页数据请求流程 二、目标网址、cookie生成(逐步分析) 1、目标网址:aHR0cHM6Ly9zdWdoLnN6dS5lZHUuY24vSHRtbC9OZXdzL0NvbHVtbnMvNy9JbmRleC5odG1s 2、快速定位入口方法 1、通过脚本监听、hook_cookie等操作可…

Qt窗口控件之浮动窗口QDockWidget

浮动窗口QDockWidget QDockWidget 用于表示 Qt 中的浮动窗口&#xff0c;浮动窗口与工具栏类似&#xff0c;可以停靠在主窗口的上下左右位置&#xff0c;也可以单独拖出来作浮动窗口。 1. QDockWidget方法 方法说明setWidget(QWiget*)用于使浮动窗口能够被添加控件。setAllo…

游戏引擎学习第180天

我们将在某个时候替换C标准库函数 今天我们要进行的工作是替换C标准库函数&#xff0c;这是因为目前我们仍然在使用C语言开发&#xff0c;并且在某些情况下会调用C标准库函数&#xff0c;例如一些数学函数和字符串格式化函数&#xff0c;尤其是在调试系统中&#xff0c;我们使…

深度学习PyTorch之动态计算图可视化 - 使用 torchviz 生成计算图

序号系列文章1深度学习训练中GPU内存管理2深度学习PyTorch之数据加载DataLoader3深度学习 PyTorch 中 18 种数据增强策略与实现4深度学习pytorch之简单方法自定义9类卷积即插即用5深度学习PyTorch之13种模型精度评估公式及调用方法6深度学习pytorch之4种归一化方法&#xff08;…

K8S学习之基础四十五:k8s中部署elasticsearch

k8s中部署elasticsearch 安装并启动nfs服务yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs创建运行nfs-provisioner需要的sa账…

Go红队开发—CLI框架(一)

CLI开发框架 命令行工具开发&#xff0c;主要是介绍开发用到的包&#xff0c;集成了一个框架&#xff0c;只要学会了基本每个人都能开发安全工具了。 该文章先学flags包&#xff0c;是比较经典的一个包&#xff0c;相比后面要学习的集成框架这个比较自由比较细化点&#xff0…

eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true

eclipse虚拟机内存监控设置SHOW_MEMORY_MONITORtrue D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.ui.prefs (文件比较多&#xff0c;别找错了&#xff09; SHOW_MEMORY_MONITORtrue 重启 -xms 1024…

量子计算与人工智能的融合:下一代算力革命

1. 引言&#xff1a;算力需求的飞速增长与量子计算的潜力 在信息技术飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;从智能助手到自动驾驶&#xff0c;再到医疗诊断&#xff0c;AI 的应用场景日益广泛。然而&#xf…