【MySQL】MySQL 使用全教程
MySQL 使用全教程
介绍
MySQL 是一种广泛使用的开源关系型数据库管理系统(Relational Database Management System),它基于 Structured Query Language(SQL)进行数据管理,允许用户存储、检索、更新和删除数据库中的数据。通过提供高性能、可扩展性以及可靠性,MySQL 被广泛应用于各种规模的数据驱动网站和应用,支持多线程、多用户操作,并能够处理大型数据库,是构建动态网站和应用程序的重要后端组件。
一个关系型数据库由一个或数个表格组成,如下所示的一个表格
name ▼ 键 ▼ 列(col)
┌┈┈┈┈┬┈┈┈┈┈┈┈┈┬┈┈┈┈┈┈┬┈┈┈┈┈┈┈┐
┆ id ┆ name ┆ uid ┆ level ┆ ◀ 表头header
├┈┈┈┈┼┈┈┈┈┈┈┈┈┤┈┈┈┈┈┈┤┈┈┈┈┈┈┈┤
┆ 1 ┆ mysql ┆ 0 ┆ 3 ┆
├┈┈┈┈┼┈┈┈┈┈┈┈┈┤┈┈┈┈┈┈┤┈┈┈┈┈┈┈┤
┆ 2 ┆ redis ┆ 12 ┆ 1 ┆ ◀ 行 row
└┈┈┈┈┴┈┈┈┈┈┈┈┈┴┈┈┈┈┈┈┴┈┈┈┈┈┈┈┘
redis ▲ 值
表头(header)每一列的名称列(col)具有相同数据类型的数据的集合行(row)每一行用来描述某个人/物的具体信息值(value)行的具体信息,每个值与该列数据类型相同键(key)用来识别某个特定的人/物的方法,有唯一性
登录 MySQL
# 默认用户名<root>,-p 是密码,
# ⚠️参数后面不需要空格
mysql -h 127.0.0.1 -u <用户名> -p<密码>
mysql -D 数据库名 -h 主机名 -u 用户名 -p
mysql -h <host> -P <端口号> -u <user> -p [db_name]
mysql -h <host> -u <user> -p [db_name]
常用的
数据库 Database
| :- | :- |
|---|---|
CREATE DATABASE db ; | 创建数据库 |
SHOW DATABASES; | 列出数据库 |
USE db; | 切换到数据库 |
CONNECT db ; | 切换到数据库 |
DROP DATABASE db; | 删除数据库 |
表 Table
| :- | :- |
|---|---|
SHOW TABLES; | 列出当前数据库的表 |
SHOW FIELDS FROM t; | 表的列表字段 |
DESC t; | 显示表格结构 |
SHOW CREATE TABLEt; | 显示创建表sql |
TRUNCATE TABLEt; | 删除表中的所有数据 |
DROP TABLEt; | 删除表格 |
Proccess
| :- | :- |
|---|---|
show processlist; | 列出进程 |
kill pid; | 杀死进程 |
查看 MySQL 信息
# 显示当前mysql的version的各种信息
mysql> status;
# 显示当前mysql的version信息
mysql> select version();
# 查看 MySQL 端口号
mysql> show global variables like 'port';
退出 MySQL 会话
mysql> exit
退出 quit; 或 \q; 一样的效果
备份
创建备份
mysqldump -u user -p db_name > db.sql
导出不带架构的数据库
mysqldump -u user -p db_name --no-data=true --add-drop-table=false > db.sql
恢复备份
mysql -u user -p db_name < db.sql
MySQL 示例
管理表格
创建一个包含三列的新表
CREATE TABLE t (
id INT,
name VARCHAR DEFAULT NOT NULL,
price INT DEFAULT 0
PRIMARY KEY(id)
);
从数据库中删除表 t
DROP TABLE t ;
向表中添加新列
ALTER TABLE t ADD column;
从表中删除列 c
ALTER TABLE t DROP COLUMN c ;
添加约束
ALTER TABLE t ADD constraint;
删除约束
ALTER TABLE t DROP constraint;
将表从 t1 重命名为 t2
ALTER TABLE t1 RENAME TO t2;
将列 c1 重命名为 c2
ALTER TABLE t1 CHANGE c1 c2 datatype;
ALTER TABLE table_name RENAME COLUMN c1 TO c2;
将列 c1 的数据类型改为 datatype
ALTER TABLE t1 MODIFY c1 datatype;
删除表中的所有数据
TRUNCATE TABLE t;
从表中查询数据
从表中查询列 c1、c2 中的数据
SELECT c1, c2 FROM t
查询表 t 中的所有行和列
SELECT * FROM t
查询数据并使用条件筛选行
SELECT c1, c2 FROM t
WHERE condition
查询表中的不同行
SELECT DISTINCT c1 FROM t
WHERE condition
按升序或降序对结果集排序
SELECT c1, c2 FROM t
ORDER BY c1 ASC [DESC]
跳过行的偏移并返回下 n 行
SELECT c1, c2 FROM t
ORDER BY c1
LIMIT n OFFSET offset
使用聚合函数对行进行分组
SELECT c1, aggregate(c2)
FROM t
GROUP BY c1
使用 HAVING 子句筛选组
SELECT c1, aggregate(c2)
FROM t
GROUP BY c1
HAVING condition
从多个表查询
内部连接 t1 和 t2
SELECT c1, c2
FROM t1
INNER JOIN t2 ON condition
左连接t1和t1
SELECT c1, c2
FROM t1
LEFT JOIN t2 ON condition
右连接 t1 和 t2
SELECT c1, c2
FROM t1
RIGHT JOIN t2 ON condition
执行完全外部连接
SELECT c1, c2
FROM t1
FULL OUTER JOIN t2 ON condition
生成表中行的笛卡尔积
SELECT c1, c2
FROM t1
CROSS JOIN t2
执行交叉连接的另一种方法
SELECT c1, c2
FROM t1, t2
使用 INNER Join 子句将 t1 连接到自身
SELECT c1, c2
FROM t1 A
INNER JOIN t1 B ON condition
使用 SQL 运算符,合并两个查询中的行
SELECT c1, c2 FROM t1
UNION [ALL]
SELECT c1, c2 FROM t2
返回两个查询的交集
SELECT c1, c2 FROM t1
INTERSECT
SELECT c1, c2 FROM t2
从另一个结果集中减去一个结果集
SELECT c1, c2 FROM t1
MINUS
SELECT c1, c2 FROM t2
使用模式匹配 % 查询行_
SELECT c1, c2 FROM t1
WHERE c1 [NOT] LIKE pattern
查询列表中的行
SELECT c1, c2 FROM t
WHERE c1 [NOT] IN value_list
查询两个值之间的行
SELECT c1, c2 FROM t
WHERE c1 BETWEEN low AND high
检查表中的值是否为 NULL
SELECT c1, c2 FROM t
WHERE c1 IS [NOT] NULL
使用 SQL 约束
将 c1 和 c2 设置为主键
CREATE TABLE t(
c1 INT, c2 INT, c3 VARCHAR,
PRIMARY KEY (c1,c2)
);
将 c2 列设置为外键
CREATE TABLE t1(
c1 INT PRIMARY KEY,
c2 INT,
FOREIGN KEY (c2) REFERENCES t2(c2)
);
使列 c1 和 c2 中的值唯一
CREATE TABLE t(
c1 INT, c2 INT,
UNIQUE(c1,c2)
);
确保 c1>0 和 c1>=c2 中的值
CREATE TABLE t(
c1 INT, c2 INT,
CHECK(c1> 0 AND c1 >= c2)
);
c2 列中的设置值不为 NULL
CREATE TABLE t(
c1 INT PRIMARY KEY,
c2 VARCHAR NOT NULL
);
修改数据
在表格中插入一行
INSERT INTO t(column_list)
VALUES(value_list);
在表格中插入多行
INSERT INTO t(column_list)
VALUES (value_list),
(value_list), …;
将行从 t2 插入 t1
INSERT INTO t1(column_list)
SELECT column_list
FROM t2;
更新列 c1 中所有行的新值
UPDATE t
SET c1 = new_value;
更新列 c1、c2 中与条件匹配的值
UPDATE t
SET c1 = new_value,
c2 = new_value
WHERE condition;
删除表中的所有数据
DELETE FROM t;
删除表中的行子集
DELETE FROM t
WHERE condition;
管理视图
创建由 c1 和 c2 组成的新视图
CREATE VIEW v(c1,c2)
AS
SELECT c1, c2
FROM t;
使用选中选项创建新视图
CREATE VIEW v(c1,c2)
AS
SELECT c1, c2
FROM t;
WITH [CASCADED | LOCAL] CHECK OPTION;
创建递归视图
CREATE RECURSIVE VIEW v
AS
select-statement -- anchor part
UNION [ALL]
select-statement; -- recursive part
创建临时视图
CREATE TEMPORARY VIEW v
AS
SELECT c1, c2
FROM t;
删除视图
DROP VIEW view_name;
管理触发器
创建或修改触发器
CREATE OR MODIFY TRIGGER trigger_name
WHEN EVENT
ON table_name TRIGGER_TYPE
EXECUTE stored_procedure;
WHEN
| :- | :- |
|---|---|
BEFORE | 在事件发生前调用 |
AFTER | 事件发生后调用 |
EVENT
| :- | :- |
|---|---|
INSERT | 为INSERT调用 |
UPDATE | 调用UPDATE |
DELETE | 调用DELETE |
TRIGGER_TYPE
| :- | :- |
|---|---|
FOR EACH ROW | - |
FOR EACH STATEMENT | - |
管理索引
在表 t 的 c1 和 c2 上创建索引
CREATE INDEX idx_name
ON t(c1,c2);
在表 t 的 c3、c4 上创建唯一索引
CREATE UNIQUE INDEX idx_name
ON t(c3,c4)
删除索引
DROP INDEX idx_name ON t;
MySQL 数据类型
Strings
| - | - |
|---|---|
CHAR | String (0 - 255) |
VARCHAR | String (0 - 255) |
TINYTEXT | String (0 - 255) |
TEXT | String (0 - 65535) |
BLOB | String (0 - 65535) |
MEDIUMTEXT | String (0 - 16777215) |
MEDIUMBLOB | String (0 - 16777215) |
LONGTEXT | String (0 - 4294967295) |
LONGBLOB | String (0 - 4294967295) |
ENUM | One of preset options |
SET | Selection of preset options |
Date & time
| Data Type | Format |
|---|---|
DATE | yyyy-MM-dd |
TIME | hh:mm:ss |
DATETIME | yyyy-MM-dd hh:mm:ss |
TIMESTAMP | yyyy-MM-dd hh:mm:ss |
YEAR | yyyy |
Numeric
| - | - |
|---|---|
TINYINT x | Integer (-128 to 127) |
SMALLINT x | Integer (-32768 to 32767) |
MEDIUMINT x | Integer (-8388608 to 8388607) |
INT x | Integer (-2147483648 to 2147483647) |
BIGINT x | Integer (-9223372036854775808 to 9223372036854775807) |
FLOAT | Decimal (precise to 23 digits) |
DOUBLE | Decimal (24 to 53 digits) |
DECIMAL | "DOUBLE" stored as string |
函数
聚合函数
| 函数 | 解释 |
|---|---|
SUM() | 计算一列值的总和 |
AVG() | 计算一列值的平均值 |
COUNT() | 计算行数,可选择性地忽略NULL值 |
MAX() | 找出一列的最大值 |
MIN() | 找出一列的最小值 |
数学函数
| 函数 | 解释 | 示例语法 | 结果 |
|---|---|---|---|
ABS(x) | 返回数值的绝对值 | ABS(-5) | 5 |
ROUND(x,y) | 四舍五入到指定的小数位数,y为小数位数,默认为0 | ROUND(3.1415,2) | 3.14 |
FLOOR(x) | 向下取整至最接近的整数 | FLOOR(3.7) | 3 |
CEIL(x) | 向上取整至最接近的整数 | CEIL(3.3) | 4 |
SQRT(x) | 返回一个数的平方根 | SQRT(16) | 4 |
MOD(x,y) | 返回x除以y的余数 | MOD(10,3) | 1 |
RAND([seed]) | 返回0到1之间的随机数,可选种子值 | RAND() 或 RAND(123) | 0.345... |
日期和时间函数
| 函数 | 解释 |
|---|---|
NOW() | 返回当前日期和时间 |
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
DATE_FORMAT() | 格式化日期时间输出 |
DATEDIFF() | 计算两个日期之间相差的天数 |
STR_TO_DATE() | 将字符串转换为日期格式 |
字符串函数
| 函数 | 解释 | 示例语法 | 结果 |
|---|---|---|---|
CONCAT(s1,s2,...) | 连接两个或更多字符串 | CONCAT('Hello, ','World!') | 'Hello, World!' |
LOWER(str) | 转换为小写 | LOWER('HELLO') | 'hello' |
UPPER(str) | 转换为大写 | UPPER('world') | 'WORLD' |
TRIM(str) | 去除字符串两端空格 | TRIM(' Hello ') | 'Hello' |
LEFT(str,len) | 提取字符串左侧的若干字符 | LEFT('Hello', 3) | 'Hel' |
RIGHT(str,len) | 提取字符串右侧的若干字符 | RIGHT('Hello', 2) | 'lo' |
SUBSTR(str,pos,len) | 提取字符串中的一部分 | SUBSTR('Hello', 2, 3) | 'ell' |
REPLACE(str,from_str,to_str) | 替换字符串中的部分文本 | REPLACE('Hello', 'l', 'L') | 'HeLLo' |
高级函数
| 函数 | 解释 | 示例语法 | 结果 |
|---|---|---|---|
| BIN(x) | 返回 x 的二进制编码,x 为十进制数。 | BIN(2) | 10 |
| BINARY(s) | 将字符串 s 转换为二进制字符串。 | BINARY 'RUNOOB' | 'RUNOOB'(显示效果,实际存储为二进制) |
| CASE | 复合条件函数,根据条件返回不同结果。 | CASE WHEN 1 > 0 THEN '1 > 0' WHEN 2 > 0 THEN '2 > 0' ELSE '3 > 0' END | '1 > 0' |
| CAST(x AS type) | 转换数据类型。 | CAST('2017-08-29' AS DATE) | 2017-08-29 |
| COALESCE(expr1, expr2, ..., expr_n) | 返回第一个非空表达式的值。 | COALESCE(NULL, NULL, 'runoob.com', NULL, 'google.com') | 'runoob.com' |
| CONNECTION_ID() | 返回当前连接的唯一ID。 | CONNECTION_ID() | 4292835(示例值) |
| CONV(x, f1, f2) | 将 f1 进制数转换为 f2 进制数。 | CONV(15, 10, 2) | 1111 |
| CONVERT(s USING cs) | 转换字符串 s 的字符集为 cs。 | CHARSET(CONVERT('ABC' USING gbk)) | gbk |
| CURRENT_USER() | 返回当前用户。 | CURRENT_USER() | guest@% |
| DATABASE() | 返回当前数据库名。 | DATABASE() | runoob |
| IF(expr, v1, v2) | 条件表达式,expr 为真则 v1,否则 v2。 | IF(1 > 0, '正确', '错误') | '正确' |
| IFNULL(v1, v2) | 如果 v1 不为 NULL,则返回 v1,否则返回 v2。 | IFNULL(NULL, 'Hello Word') | 'Hello Word' |
| ISNULL(expression) | 判断表达式是否为 NULL。 | ISNULL(NULL) | 1 |
| LAST_INSERT_ID() | 返回最近生成的 AUTO_INCREMENT 值。 | LAST_INSERT_ID() | 6(示例值) |
| NULLIF(expr1, expr2) | 若 expr1 等于 expr2,则返回 NULL,否则返回 expr1。 | NULLIF(25, 25) | NULL |
相关文章:
【MySQL】MySQL 使用全教程
MySQL 使用全教程 介绍 MySQL 是一种广泛使用的开源关系型数据库管理系统(Relational Database Management System),它基于 Structured Query Language(SQL)进行数据管理,允许用户存储、检索、更新和删除数据库中的数据。通过提供…...
油猴脚本-GPT问题导航侧边栏增强版
为 GPT官网和相关网站提供了一个便捷的侧边栏目录,能够自动搜集当前会话页面的问题,展示在侧边栏上,可快速导航到问题的位置。 安装使用地址:https://scriptcat.org/zh-CN/script-show-page/1972 安装前请确保浏览器有油猴,没有…...
Java Lock ConditionObject 总结
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & ConditionObject & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & ConditionObject & 总结》(学习…...
模块化主动隔振系统市场规模:2023年全球市场规模大约为220.54百万美元
模块化主动隔振系统是一种用于精密设备和实验装置的隔振解决方案,通过主动控制技术消除振动干扰,提供稳定的环境。目前,随着微纳制造和精密测量技术的发展,对隔振系统的要求越来越高。模块化设计使得系统能够灵活适应不同负载和工…...
SpringAOP:对于同一个切入点,不同切面不同通知的执行顺序
目录 1. 问题描述2. 结论结论1:"对于同一个切入点,同一个切面不同类型的通知的执行顺序"结论2:"对于同一个切入点,不同切面不同类型通知的执行顺序" 3. 测试环境:SpringBoot 2.3.4.RELEASE测试集合…...
unique_ptr初始化
std::unique_ptr 是 C11 引入的智能指针,用于管理动态分配的对象的生命周期。unique_ptr 确保每个动态分配的对象有且仅有一个所有者,当 unique_ptr 超出作用域时,它会自动释放其管理的对象。以下是 std::unique_ptr 的一些常见初始化方法。 …...
HelloCTF [RCE-labs] Level 8 - 文件描述和重定向
开启靶场,打开链接: GET传参cmd system($cmd.">/dev/null 2>&1"); 这行代码将执行命令 $cmd,并且将其标准输出和标准错误输出都重定向到 /dev/null,这意味着无论命令的输出还是可能产生的错误信息都不会显示…...
DEVOPS: 集群伸缩原理
概述 阿里云 K8S 集群的一个重要特性,是集群的节点可以动态的增加或减少有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用 率降低的时候,释放节点以节省费用理解实现原理,在遇到问题的…...
什么是SMO算法
SMO算法(Sequential Minimal Optimization) 是一种用于求解 支持向量机(SVM) 二次规划对偶问题的优化算法。它由 John Platt 在 1998 年提出,目的是快速解决 SVM 的优化问题,特别是当数据集较大时ÿ…...
MySQL根据.idb数据恢复脚本,做成了EXE可执行文件
文章目录 1.代码2.Main方法打包3.Jar包打成exe可执行文件4.使用(1.)准备一个表结构一样得数据库(2.)打开软件(3.)输入路径 5.恢复成功 本文档只是为了留档方便以后工作运维,或者给同事分享文档内…...
Spring Boot面试题
1.什么是SpringBoot?它的主要特点是什么? Spring Boot 是一个基于 Spring 框架的开发和构建应用程序的工具,它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一种约定优于配置的方式,通过自动配置和默认值&#…...
原生页面引入Webpack打包JS
Webpack简介 概述: Webpack是一个现代JavaScript应用程序的静态模块打包器。它将应用程序中的每个文件视为一个模块,并通过配置规则来解析这些模块之间的依赖关系,最终将其打包成一个或多个浏览器可以执行的文件。动态加载(Code …...
健康之路押注医药零售:毛利率下滑亏损扩大,医疗咨询人次大幅减少
《港湾商业观察》黄懿 2024年9月13日,健康之路股份有限公司(下称“健康之路”)再次递表港交所,建银国际为独家保荐人。健康之路国内运营主体为健康之路(中国)信息技术有限公司和福建健康之路信息技术有限公…...
【人工智能-初级】第7章 聚类算法K-Means:理论讲解与代码示例
文章目录 一、K-Means聚类简介二、K-Means 聚类的工作原理2.1 初始化簇中心2.2 分配簇标签2.3 更新簇中心2.4 迭代重复2.5 K-Means 算法的目标三、K-Means 聚类的优缺点3.1 优点3.2 缺点四、K 值的选择五、Python 实现 K-Means 聚类5.1 导入必要的库5.2 生成数据集并进行可视化…...
HOT 100 技巧题(136/169/75/31/287)
136. 只出现一次的数字 技巧类型题目,通过异或运算实现 169. 多数元素 三种常见解法:1. 哈希2. 排序3. 投票法 75. 颜色分类 单指针 两次遍历:第一次遍历把所有0都交换到前面,记录最后一个0的位置index,第二次遍…...
什么是时间戳?怎么获取?有什么用?
在 JavaScript 中,时间戳通常表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。我们可以使用 Date 对象来获取当前时间的时间戳,或者将特定的日期转换为时间戳。在JavaScript中,时间戳通常以毫秒为单位表示。 如何获取时间戳 在Java…...
LeetCode:459重复的子字符串
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: 输入: s "abcabcabcabc" 输…...
【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现
开题报告 围场县拥有丰富的自然景观和野生动植物资源,同时面临着旅游业发展和自然保护之间的平衡问题,通过强调自然保护,这个平台可以教育游客如何尊重和保护当地的生态环境。同时,平台还可以提供关于生态保护的信息,…...
【ANTs】医疗影像工具ANTs多种安装方式教程
介绍ANTs的几种简单的安装教程 基于Releases的安装 Github上选择适配自己操作系统的安装包,链接: link 一般使用最新版本。这里官方操作说明,支持Ubuntu、MacOS、CentOS,但是windows有安装包,不知道怎么用。。。 下载后有两个文件夹,bin和lib,bin里面长这样(图示wind…...
想要音频里的人声,怎么把音频里的人声和音乐分开?
在音频处理领域,将音频中的人声和音乐分开是一个常见需求,尤其对于音乐制作、影视后期以及个人娱乐应用来说,这种分离技术显得尤为重要。随着科技的发展,现在已经有多种方法可以实现这一目的。 一、使用专业音频处理软件 市面上有…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
