【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接
【MySQL】C/C++引入MySQL客户端
- 安装mysqlclient库
- mysql接口介绍
- 初始化mysql_init
- 链接数据库mysql_real_connect
- 下发mysql命令mysql_query
- 获取出错信息mysql_error
- 获取执行结果mysql_store_result
- 获取结果行数mysql_num_rows
- 获取结果列数mysql_num_fields
- 判断结果列数mysql_field_count
- mysql_num_fields 与 mysql_field_count的区别
- 获取列名mysql_fetch_fields
- 获取结果内容mysql_fetch_row
- 获取列当前列的长度mysql_fetch_lengths
- 释放结果集mysql_freer_result
- 关闭mysql链接mysql_close
- 整体测试代码
- 图形化界面连接
- 下载workbench
- Ubuntu提供mysql权限
- workbench图形化连接
安装mysqlclient库
- 安装mysql
Ubuntu安装MySQL8.0 - 安装连接库
在Ubuntu上使用C/C++连接MySQL 8.0,你需要使用MySQL官方提供的连接器库,即libmysqlclient。
sudo apt-install libmysqlclient-dev
执行时需要连接这个库
gcc -o xxx yyy -lmysqlclient
mysql接口介绍
相关具体函数可到mysql官网中去查询链接: 直接点击查看所有8.0版本函数
- 找到官网
- 找到CAPI
- 查看所有函数
初始化mysql_init
要使用库,必须先进行初始化!
- 函数原型:
MYSQL *mysql_init(MYSQL *mysql)
分配或初始化适用于 mysql_real_connect() 的 MYSQL 对象。如果 mysql 为 NULL 指针,则该函数分配、初始化并返回一个新对象。否则,将初始化该对象并返回该对象的地址。如果 mysql_init() 分配了一个新对象,则在调用 mysql_close() 关闭连接时将释放该对象。
在非多线程环境中,mysql_init() 会根据需要自动调用 mysql_library_init()。但是,mysql_library_init() 在多线程环境中不是线程安全的,因此 mysql_init() 也不是。在调用 mysql_init() 之前,要么在生成任何线程之前调用 mysql_library_init(),要么使用互斥锁来保护 mysql_library_init() 调用。这应该在任何其他客户端库调用之前完成。
所以一般mysql_int()的这个里面的参数都是null;
- 返回值:
已初始化的 MYSQL* 处理程序。如果内存不足以分配新对象,则返回 NULL。
链接数据库mysql_real_connect
初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)
- 函数原型:
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)
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");
参数解析:
- 第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
- host:连接的主机名/ip
- user:连接的用户名
- passwd:连接数据库的密码
- db:连接数据库的名称
- port:连接数据库的端口号
- unix_socket:连接数据库的连接方式(一般直接设置为NULL即可)
- client_flag:这个也是一般直接设置为0即可
- 返回值:
如果连接成功,则返回 MYSQL* 连接处理程序;如果连接失败,则返回 NULL。对于成功的连接,返回值与第一个参数的值相同。
int main()
{// std::cout << "mysql client version" << mysql_get_client_info()<< std::endl;MYSQL* my = mysql_init(nullptr);if (my == NULL){std::cerr << "mysql init error..." << std::endl;return 1;}if (mysql_real_connect(my,host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, NULL, 0) == nullptr){std::cerr << "mysql connect error..." << std::endl;return 2;}std::cout << "mysql connect success..." << std::endl;sleep(10); // 这里我们不急着关闭,可以先看一下现象mysql_close(my);return 0;
}
从上面的结果我们也可以看出是连接成功的了。
下发mysql命令mysql_query
- 函数原型
int mysql_query(MYSQL *mysql, const char *stmt_str)
执行以空字符结尾的字符串 stmt_str 指向的 SQL 语句。通常,该字符串必须由一条 SQL 语句组成,且不带终止分号 ( ; ) 或 \g。如果已启用多语句执行,则该字符串可以包含多条以分号分隔的语句。
mysql_query() 不能用于包含二进制数据的语句;您必须使用 mysql_real_query()。(二进制数据可能包含 \0 字符,mysql_query() 将其解释为语句字符串的结尾。)
- 参数
第一个参数时mysql_init的返回值,第二个参数时要执行的SQL语句
- 返回值
零表示成功。非零值表示发生错误。
- 案例
创建一张新表
std::string sql = "create table test(id int primary key, name varchar(20))";
if (mysql_query(my, sql.c_str()) != 0)
{std::cerr << "mysql query error..." << std::endl;std::cout << mysql_error(my) <<std::endl;return 3;
}
std::cout << "mysql query success..." << std::endl;
Database changed
mysql> show tables;
+----------------+
| Tables_in_conn |
+----------------+
| test |
+----------------+
1 row in set (0.00 sec)mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
获取出错信息mysql_error
- 函数原型:
const char mysql_error(MYSQL *mysql);
对于 mysql 指定的连接,mysql_error() 返回一个以空字符结尾的字符串,其中包含最近调用的失败的 API 函数的错误消息。如果函数未失败,mysql_error() 的返回值可能是前一个错误或一个空字符串(表示没有错误)。
经验法则是,所有必须向服务器询问信息的函数如果成功则重置 mysql_error()。
- 参数解析
参数就是mysql_init的返回值
- 返回值
描述错误的以空字符结尾的字符串。如果没有发生错误,则为空字符串。
- 案例
我们再次执行mysql_query的命令,创建一张表
获取执行结果mysql_store_result
- 函数原型:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。
- 参数解析
参数就是mysql_init的返回值
typedef struct MYSQL_RES {uint64_t row_count;MYSQL_FIELD *fields;struct MYSQL_DATA *data;MYSQL_ROWS *data_cursor;unsigned long *lengths; /* column lengths of current row */MYSQL *handle; /* for unbuffered reads */const struct MYSQL_METHODS *methods;MYSQL_ROW row; /* If unbuffered read */MYSQL_ROW current_row; /* buffer to current row */struct MEM_ROOT *field_alloc;unsigned int field_count, current_field;bool eof; /* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */bool unbuffered_fetch_cancelled;enum enum_resultset_metadata metadata;void *extension;
} MYSQL_RES;
- 返回值
指向包含结果的 MYSQL_RES 结果结构的指针。如果语句未返回结果集或发生错误,则为 NULL。要确定是否发生错误,请检查 mysql_error() 是否返回非空字符串、mysql_errno() 是否返回非零,或 mysql_field_count() 是否返回零。
- 案例
mysql> select * from test;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+----+--------+
3 rows in set (0.00 sec)
uint64_t rows = mysql_num_rows(res); // 获取行
unsigned int cols = mysql_num_fields(res); // 获取列std::cout << "行:" << rows << ",列" << cols << std::endl;
获取结果行数mysql_num_rows
- 函数原型
uint64_t mysql_num_rows(MYSQL_RES *result)
- 参数
参数是mysq_stroe_result的返回值。
- 返回值
返回结果集中的行数
获取结果列数mysql_num_fields
- 函数原型:
unsigned int mysql_num_fields(MYSQL_RES *result)
您可以从指向结果集或连接处理程序的指针获取列数。如果 mysql_store_result() 或 mysql_use_result() 返回 NULL(因此您没有结果集指针),则可以使用连接处理程序。在这种情况下,您可以调用 mysql_field_count() 来确定 mysql_store_result() 是否应该产生非空结果。这使客户端程序能够采取适当的操作,而无需知道查询是否为 SELECT(或类似 SELECT)语句。此处显示的示例说明了如何完成此操作。
- 参数解析
参数就是mysql_store_result的返回值
- 返回值
返回结果集中的列数,表示结果集中列数的无符号整数。
判断结果列数mysql_field_count
- 函数原型
unsigned int mysql_field_count(MYSQL *mysql)
此函数的正常使用是当 mysql_store_result() 返回 NULL(因此您没有结果集指针)时。在这种情况下,您可以调用 mysql_field_count() 来确定 mysql_store_result() 是否应该产生非空结果。这使客户端程序能够采取适当的操作,而无需知道查询是否是 SELECT(或类似 SELECT)语句。此处显示的示例说明了如何执行此操作
- 参数
参数就是mysql_init的返回值
- 返回值
返回连接上最近查询的列数。
mysql_num_fields 与 mysql_field_count的区别
- 参数区别
首先就是mysql_num_fields的参数是mysql_store_result的返回值,而mysql_field_count的参数则是mysql_init的返回值。
- 用途区别
虽然这两个函数返回的都是字段列的个数。但是他们的作用以及查询的条件也是不一样的。mysql_field_count函数是返回作用在连接上的最近查询的列数,它的主要用途是在mysql_store_result()返回NULL(因而没有结果集指针)时,通过调用mysql_field_count()来判断mysql_store_result()是否应生成非空结果。而mysql_num_fields是根据mysql_store_result的返回值来查询列数的。因为像insert,update,select作用在mysql_store_result函数时是没有返回值的,所以这个时候mysql_store_result返回的就是NULL,而mysql_num_fields函数内部肯定是要对mysql_store_result的返回值做解引用的,这个时候对NULL做解引用显然会出现错误,所以需要加以判断。
- 综上所述
其实mysql_field_count更像时起到了一个判断的作用,而mysql_num_fields才像是一样获取列数的函数。两者在使用场景和返回值上有所区别,前者更侧重于查询的结果判断,而后者则提供具体的字段信息
- mysql官网上的示例
if (mysql_query(&mysql,query_string))
{// error
}
else // query succeeded, process any data returned by it
{result = mysql_store_result(&mysql);if (result) // there are rows{num_fields = mysql_num_fields(result);// retrieve rows, then call mysql_free_result(result)}else // mysql_store_result() returned nothing; should it have?{if(mysql_field_count(&mysql) == 0){// query does not return data// (it was not a SELECT)num_rows = mysql_affected_rows(&mysql);}else // mysql_store_result() should have returned data{fprintf(stderr, "Error: %s\n", mysql_error(&mysql));}}
}
- 注意事项
select 0------ 假设执行了select 0 查询id等于0这条语句,假设没有id=0的这条语句
select 0---count_fields is 2
select 0---num_fields is 2
select 0---num_rows is 0
从上面我们也可以发现,就算我们查找的id=0的行数=0,也就是没有这条记录,但是mysql_field_count和mysql_num_fields显示的都不是0(假设列字段为2)都显示为2。所以我们就可以得出一结论。在执行mysql_store_result时有两个结果:第一种结构就是执行delete,update,insert这样的语句时,mysql_store_result返回的是NULL,此时可以用mysql_field_count来进行判断。第二就是执行select,show这样的语句时一定是有返回值的,但是返回的记录也就是行可以是为0的,也可以不为0,这就有点像一张表可以没有内容,但是一定会有表头。
获取列名mysql_fetch_fields
- 函数原型:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
返回结果集的所有 MYSQL_FIELD 结构的数组。每个结构为结果集的一列提供字段定义。也就是返回列属性。
- 参数解析
参数就是mysq_store_result的返回值
typedef struct MYSQL_FIELD {char *name; /* Name of column */char *org_name; /* Original column name, if an alias */char *table; /* Table of column if column was a field */char *org_table; /* Org table name, if table was an alias */char *db; /* Database for table */char *catalog; /* Catalog for table */char *def; /* Default value (set by mysql_list_fields) */unsigned long length; /* Width of column (create length) */unsigned long max_length; /* Max width for selected set */unsigned int name_length;unsigned int org_name_length;unsigned int table_length;unsigned int org_table_length;unsigned int db_length;unsigned int catalog_length;unsigned int def_length;unsigned int flags; /* Div flags */unsigned int decimals; /* Number of decimals in field */unsigned int charsetnr; /* Character set */enum enum_field_types type; /* Type of field. See mysql_com.h for types */void *extension;
} MYSQL_FIELD;
- 返回值
结果集所有列的 MYSQL_FIELD 结构数组。如果结果集没有元数据,则为 NULL。每个结构为结果集的一列提供字段定义。
- 案例
MYSQL_FIELD *fields = mysql_fetch_fields(res);
for (int i = 0; i < cols; i++)
{std::cout << fields[i].name << " ";
}
std::cout << std::endl;
获取结果内容mysql_fetch_row
- 函数原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。
typedef char **MYSQL_ROW; /* return data as array of strings */
- 参数解析
参数就是mysql_store_result的返回值
- 返回值
描述错误的以空字符结尾的字符串。如果没有发生错误,则为空字符串。
- 案例
其实这个函数我们可以看作是C++的迭代器,他会自动进行往后遍历
MYSQL_ROW line;
for (int i = 0; i < rows; i++)
{line = mysql_fetch_row(res);for (int j = 0; j < cols; j++){std::cout << line[j] << " ";}std::cout << std::endl;
}
获取列当前列的长度mysql_fetch_lengths
- 函数原型
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
返回结果集中当前行的列的长度。如果您计划复制字段值,此长度信息对于优化也很有用,因为您可以避免调用 strlen()。此外,如果结果集包含二进制数据,则必须使用此函数来确定数据的大小,因为 strlen() 对于任何包含空字符的字段都会返回不正确的结果。
mysql_fetch_lengths() 仅对结果集的当前行有效。如果在调用 mysql_fetch_row() 之前或在检索结果中的所有行之后调用它,它将返回 NULL。
- 参数
参数就是mysql_store_result的返回值
- 返回值
表示每列大小的无符号长整数数组(不包括任何终止空字节)。如果发生错误,则返回 NULL。
- 案例
//必须先调用了mysql_fetch_row后才能调用,他仅对结果集的当前行后效,一般都是先到用完mysql_fetch_row再调用
unsigned long *lengths = mysql_fetch_lengths(res);
if (rows)
{for (int i = 0; i < cols; i++){printf("Column %u is %lu bytes in length.\n", i, lengths[i]);}std::cout << std::endl;
}
释放结果集mysql_freer_result
void mysql_free_result(MYSQL_RES *result)
mysql_free_result() 释放由 mysql_store_result()、mysql_use_result()、mysql_list_dbs() 等为结果集分配的内存。处理完结果集后,必须通过调用 mysql_free_result() 释放其使用的内存。
所以一般再时使用完结果集后要释放它,防止内存泄漏。
关闭mysql链接mysql_close
- 函数原型:
void mysql_close(MYSQL *mysql)
关闭先前打开的连接。如果处理程序是由 mysql_init() 或 mysql_connect() 自动分配的,mysql_close() 还会释放由 mysql 指向的连接处理程序。关闭后请勿使用该处理程序。
- 参数解析
参数就是mysql_init的返回值
整体测试代码
#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <unistd.h>// const std::string host = "127.0.0.1";
const std::string host = "localhost";
const std::string user = "chuyang";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{// 1. 初始化MYSQL *my = mysql_init(nullptr);if (my == NULL){std::cerr << "mysql init error..." << std::endl;return 1;}// 2. 数据库连接if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, NULL, 0) == nullptr){std::cerr << "mysql connect error..." << std::endl;return 2;}// 3. 设置字符集mysql_set_character_set(my, "utf8");std::cout << "mysql connect success..." << std::endl;// 4. 对数据库进行操作std::string sql = "create table if not exists test(id int primary key, name varchar(20))";if (mysql_query(my, sql.c_str()) != 0){std::cerr << "mysql query error..." << std::endl;std::cout << mysql_error(my) << std::endl;return 3;}std::cout << "mysql query success..." << std::endl;sql = "select * from test";if (mysql_query(my, sql.c_str()) != 0){std::cerr << "mysql query error..." << std::endl;std::cout << mysql_error(my) << std::endl;return 3;}// 5. 获取结果(主要是针对select)MYSQL_RES *res = mysql_store_result(my);if (nullptr == res){std::cerr << "mysql stroe result error..." << std::endl;std::cout << mysql_error(my) << std::endl;return 4;}std::cerr << "mysql stroe result success..." << std::endl;// 6. 获取结果的列数,和行数uint64_t rows = mysql_num_rows(res); // 获取行unsigned int cols = mysql_num_fields(res); // 获取列std::cout << "行:" << rows << ",列" << cols << std::endl;// 7. 拿到结果// 获取属性MYSQL_FIELD *fields = mysql_fetch_fields(res);for (int i = 0; i < cols; i++){std::cout << fields[i].name << " ";}std::cout << std::endl;// 获取内容MYSQL_ROW line;for (int i = 0; i < rows; i++){line = mysql_fetch_row(res);for (int j = 0; j < cols; j++){std::cout << line[j] << " ";}std::cout << std::endl;}//必须先调用了mysql_fetch_row后才能调用,他仅对结果集的当前行后效,一般都是先到用完mysql_fetch_row再调用unsigned long *lengths = mysql_fetch_lengths(res);if (rows){for (int i = 0; i < cols; i++){printf("Column %u is %lu bytes in length.\n", i, lengths[i]);}std::cout << std::endl;}// 8. 释放结果集mysql_free_result(res);// 9. 关闭连接mysql_close(my);return 0;
}
图形化界面连接
这里用的是workbanch进行的连接
下载workbench
- 进入MySQL官网
- 点击社区版
- 下载workbench
Ubuntu提供mysql权限
因为Ubuntu下我们的mysql不推荐给root账号使用登录,而是创建普通用户让其登陆。
- 创建普通用户,并给予权限
mysql> create user 'chuyang'@'%' identified by '密码';
mysql> grant all on conn.* to 'chuyang'@'%';mysql> select User, Host from user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| chuyang | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
workbench图形化连接
相关文章:

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接
【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...

Wireshark分析工具
简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里…...

linux网络配置脚本
通过脚本,设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以,我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...

IT管理:我与IT的故事4
首先,宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了,所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通,大家如果发邮件到我办公邮箱的时候,若不嫌麻烦,可以抄…...

短链接系统设计方案
背景 需要设计一个短链接系统,主要功能主要有如下几点: ToB: 输入一个长链接,转换成短链接。这个短链接有时效性,可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC…...

Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)
目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中,常会遇到自动化的需求,那么在自动采集、配置等对网络设备的自动化需求中,不可避免的会遇到需要登录-&…...

QT判断操作系统类型和CPU架构
一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件,判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...

input[type=checkbox]勾选框自定义样式
效果图: <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...

鼠害监测系统:科技守护农业安全
在农业生产中,鼠害一直是威胁作物安全、影响产量的重要因素。然而,随着科技的飞速发展,鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术,实现了诱鼠、投喂鼠药、鼠情监测及…...

Ubuntu20.04如何安装配置JDK
资源准备 官方下载地址(根据自己的系统版本选择不同版本进行下载即可):Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...
Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)
文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...
人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连
人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...

西安电子科技大学萌新智慧指南(校区篇)
本次是西安电子科技大学南校区【本部南校区】 刚刚进入校园 相信大家对校园环境还很陌生 接下来就用一张地图 带大家迅速了解一下南校区的构造 宿舍 学生宿舍主要分为三部分 竹园公寓 1-4 海棠公寓 5-10 丁香公寓 11-15 研究生们主要居住在 海棠续建5、丁香14、丁香1…...

JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件
鼠标滚轮滚动事件:onwheel 获取鼠标滚轮滚动的方向:wheelDelta 比如:向上滚动:109 (所有正值都是向上) 向下滚动:-109(所有负值都是向下) 注意:当…...

怎样做网站推广
拥有一个精致而富有吸引力的网站是成功商业运营的关键。然而,仅仅拥有一个网站是不够的,您还需要通过有效的推广策略吸引更多的访问者。以下是一些成功的网站推广策略,帮助您提升流量并增加知名度。 1. 优化SEO: 搜索引擎优化&am…...

Unity引擎加密方案解析
据悉,Unity引擎的全球市场占有率已经超过50%,而在全球排名前1000的手游当中,这一数据更是高达73%。不止如此,Unity在中国拥有高达350万的注册用户,《崩坏星穹铁道》、《王者荣耀》等爆款游戏均为Unity引擎开发。 庞大…...

遇到的几个iOS问题
1 unable to boot the simulator 跑模拟器的时候遇到这个报错, 解决方法 处理办法: 删除升级之前的模拟器缓存,重启模拟器。删除路径:~/Library/Developer/CoreSimulator/Cache 注意:后面可能还会复现这个报错&#x…...

掌握ChatGPT写作艺术:从入门到精通的四个层次
这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作,我归纳了以下规律,希望能为你带来启发。 一、写作步骤 撰写一篇文章,思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…...

虚幻UE5安装报错误代码:SU-PQR5
找到图标的快捷方式 “Epic Games Launcher”右键属性,在目标最后添加-SkipBuildPatchPrereq,如下图: 最后,见证奇迹成功打开软件,可以继续安装啦。 参考资料: 【图片】求教各位大佬--错误代码SU-PQR5【ep…...

谷歌开源Gemma-2 百亿参数大模型,性能超越Llama-3模型,免费使用
Gemma 模型 Gemma模型是谷歌发布的一个开源模型,任何人都可以免费下载预训练模型,进行使用。而谷歌最近也发布了Gemma 2 模型,模型参数超过了 200 亿大官,果真大模型最后都是拼参数的时候吗。 Gemma 2 模型发布 Gemma 2 模型可以…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...