当前位置: 首页 > article >正文

Linux安装MySQL数据库并使用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用户端实现的无人超市项目,也是成功复刻了一个大佬的项目,学到了很多东西,希望大家点个关注支持一下。

相关文章:

Linux安装MySQL数据库并使用C语言进行数据库开发

目录 一、前言 二、安装VMware运行Ubuntu 1.安装VMware 2.使用VMware打开Ubuntu 三、配置VMware使用网卡 1.添加NAT网卡 四、Linux下安装MySQL数据库 五、安装MySQL开发库 六、演示代码 sql_connect.c sql_connect.h main.c中数据库相关代码 结尾 一、前言 由于最…...

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...

伯努利分布和二项分布学习笔记

目录 1. 伯努利分布1.1定义1.2概率质量函数1.3数学期望与方差1.4应用示例 2. 二项分布2.1定义2.1概率质量函数2.2数学期望与方差2.3性质与图形 3. 伯努利分布与二项分布的关系4. 总结 1. 伯努利分布 伯努利分布&#xff08;Bernoulli Distribution&#xff09;&#xff0c;又称…...

Redis实战常用二、缓存的使用

一、什么是缓存 在实际开发中,系统需要"避震器"&#xff0c;防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪. 这在实际开发中对企业讲,对产品口碑,用户评价都是致命的。所以企业非常重视缓存技术; 缓存(Cache)&#xff1a;就是数据交换的缓冲区&…...

G口服务器和普通服务器之间的区别

今天小编主要来为大家介绍一下G口服务器和普通服务器之间的区别&#xff01; 首先&#xff0c;从硬件配置上看&#xff0c;普通服务器通常都会配备中央处理器、内存和硬盘等基本的硬件配置&#xff0c;能够适用于各种应用程序和服务&#xff1b;G口服务器除了基础的硬件配置还增…...

通过国内源在Ubuntu20.0.4安装repo

国内三大免费源&#xff1a; 清华大学&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学&#xff1a;USTC Open Source Software Mirror阿里云&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到&#xff1a;…...

多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题

多维动态规划 不同路径 https://leetcode.cn/problems/unique-paths/ 核心思路 比较简单 f[i][j] f[i - 1][j] f[i][j - 1] ; 示例代码 class Solution {public int uniquePaths(int n, int m) {int[][] f new int[n][m];for (int i 0; i < n; i)f[i][0] 1;for…...

《Java到Go的平滑转型指南》

文章目录 **文章摘要****核心主题****关键内容提炼****决策者行动清单****核心结论** **第一章&#xff1a;转型决策&#xff1a;为什么要从Java转向Go&#xff1f;****1.1 性能对比&#xff1a;GC机制与并发模型差异****GC机制对比****并发模型基准测试** **1.2 开发效率&…...

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…...

SpringMVC 请求处理

SpringMVC 请求处理深度解析&#xff1a;从原理到企业级应用实践 一、架构演进与核心组件协同 1.1 从传统Servlet到前端控制器模式 SpringMVC采用前端控制器架构模式&#xff0c;通过DispatcherServlet统一处理请求&#xff0c;相比传统Servlet的分散处理方式&#xff0c;实…...

unittest自动化测试实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…...

leetcode3.无重复字符的最长字串

采用滑动窗口方法 class Solution { public:int lengthOfLongestSubstring(string s) {int ns.size();if(n0)return 0;int result0;unordered_set<char> set;set.insert(s[0]);for(int i0,j0;i<n;i){while(j1<n&&set.find(s[j1])set.end()){set.insert(s[…...

Android Compose 框架派生状态(derivedStateOf、rememberCoroutineScope)深入剖析(十五)

一、引言 在 Android 开发领域&#xff0c;高效的状态管理对于构建响应式、高性能的应用程序至关重要&#xff0c;在 Jetpack Compose 中&#xff0c;derivedStateOf 和 rememberCoroutineScope 这两个与派生状态相关的特性在状态管理方面发挥着关键作用。派生状态允许我们根据…...

3.25-2request库

request库 一、介绍request库 &#xff08;1&#xff09;requests是用python语言编写的简单易用的http库&#xff0c;用来做接口测试的库&#xff1b; &#xff08;2&#xff09;接口测试自动化库有哪些&#xff1f; requests、urllib 、urllib2、urllib3、 httplib 等&…...

《破解老龄化的智能密钥:机器人四维战略与未来养老生态》

一、引言&#xff1a;老龄化社会与智能机器人的必然性 全球老龄化趋势与老年人核心需求&#xff08;健康管理、生活辅助、心理陪伴、安全保障&#xff09; 全球正面临着严峻的老龄化挑战。根据联合国发布的数据&#xff0c;全球60岁及以上人口数量在过去几十年中持续增长&…...

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …...

SpringMVC 配置

一、MVC 模式简介 在软件开发的广袤天地中&#xff0c;MVC 模式宛如一座明亮的灯塔&#xff0c;指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块&#xff0c;更是将 MVC 模式的优势发挥得淋漓尽致&#xff0c;堪称 Servlet 的强…...

Python 3.8 Requests 爬虫教程(2025最新版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私&#xff01; 一、环境配置与基础验证 # 验证 Python 版本&#xff08;需 ≥3.8&#xff09; import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库&#xff08;若未安装&#xff09; # 命令行执…...

蓝桥杯备考之 最长上升子序列问题(挖地雷)

这道题其实就是正常的最长上升子序列问题&#xff0c;但是我们还要把最优方案输出出来&#xff0c;我们可以用个pre数组来维护就行了&#xff0c;每当我们更新以i为结尾的最长子序列&#xff0c;如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…...

华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…...

【Python Cookbook】字符串和文本(二)

字符串和文本&#xff08;二&#xff09; 6.字符串忽略大小写的搜索替换7.最短匹配模式8.多行匹配模式9.将 Unicode 文本标准化10.在正则式中使用 Unicode 6.字符串忽略大小写的搜索替换 你需要以忽略大小写的方式搜索与替换文本字符串。 为了在文本操作时忽略大小写&#xf…...

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…...

六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)

1. file [选项] 文件名 用于确定文件类型的实用工具。它会通过分析文件内容&#xff08;而不仅仅是文件扩展名&#xff09;来判断文件的实际类型 示例输出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…...

信源的分类及数学模型

信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源&#xff08;一维离散信源&#xff09; 信源输出的消息数有限或可数&#xff0c;且每次只输出符号集的一个消息 样本空间&…...

嵌入式硬件工程师从小白到入门-PCB绘制(二)

PCB绘制从小白到入门&#xff1a;知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能&#xff08;如电源、信号处理、通信&#xff09;。确定关键参数&#xff08;电压、电流、频率、接口类型&#xff09;。 原理图设计 元器件选型&#xff1a;匹配封装、电压、…...

抽象工厂设计模式及应用案例

引言 在软件开发中&#xff0c;合理的设计模式可以有效地提高代码的可维护性、可扩展性和可重用性。抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;便是一个重要的创建型设计模式&#xff0c;它允许我们在不指定具体类的情况下&#xff0c;创建一系列相关或相…...

LVS NAT模式实现三台RS的轮询访问

节点规划: 配置RS&#xff1a; RS1-RS3的网关配置均为 192.168.163.8 配置RS1&#xff1a; [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…...

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…...

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二&#xff1a; rich-text | uni-app...

Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题

目录 一、Xinference部署 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 &#xff08;三&#xff09;参数 &#xff08;四&#xff09;错误问题 &#xff08;五&#xff09;Xinference配置Text-embedding模型 &#xff08;六&#xff09;Xinference配…...