国产数据库TiDB从入门到放弃教程
国家层面战略,安全的角度,硬件、软件国产化是趋势,鸿蒙电脑操作系统、鸿蒙手机操作系统…数据库也会慢慢国产化,国产数据库TiDB用起来比OceanBase丝滑,本身没有那么重。
从入门到放弃
- 1. 介绍
- 1.1 TiDB 的主要特点
- 1.2 TiDB 架构概览
- 1.3 使用场景
- 2. 安装
- 3. SQL语句
- 4. SQL分类
- 5. DDL
- 5.1 库的DDL
- 5.2 表、列的DDL
- 6. DML
- 6.1 添加数据
- 6.2 修改数据
- 6.3 删除数据
- 7. DQL
- 7.1 基础查询
- 7.2 条件查询
- 7.3 排序查询
- 7.4 聚合函数
- 7.5 分组查询
- 7.6 分页查询
- 8. 约束
- 8.1 约束分类
- 9. 多表查询
- 9.1 内连接查询
- 9.2 外连接查询
- 9.3 子查询
- 10. 事务
- 10.1 隔离级别
- 11. 函数
- 11.1 数学函数
- 11.2 字符串函数
- 11.3 日期函数
- 12. DCL
- 12.1 用户管理
- 12.2 权限管理
- 13. 备份与还原
1. 介绍
TiDB 是一个开源的分布式 NewSQL 数据库,兼容 MySQL 协议。它结合了传统关系型数据库(RDBMS)和 NoSQL 数据库的优点,旨在提供水平扩展、强一致性和高可用性。TiDB 由 PingCAP 公司开发,并得到了社区的广泛支持。
1.1 TiDB 的主要特点
-
MySQL 兼容:
- TiDB 完全兼容 MySQL 协议,使得现有的 MySQL 应用可以无缝迁移到 TiDB,而无需修改代码。
- 支持大部分 MySQL 特性,如事务、存储过程、触发器等。
-
水平扩展:
- TiDB 设计为分布式架构,可以轻松地通过添加更多节点来实现水平扩展,以应对不断增长的数据量和查询负载。
- 分布式架构还允许 TiDB 处理大规模数据集,同时保持高性能。
-
强一致性:
- TiDB 使用 Raft 共识算法来保证分布式系统中的强一致性。
- 这意味着所有成功的写入操作在集群中的一致副本上都是一致的,从而避免了数据不一致的问题。
-
高可用性:
- TiDB 架构中的各个组件(如 TiKV、PD 和 TiDB Server)都是无单点故障设计,确保系统的高可用性。
- 数据自动复制和故障转移机制进一步增强了系统的可靠性。
-
HTAP (Hybrid Transactional/Analytical Processing):
- TiDB 支持混合事务/分析处理,即可以在同一个集群中同时高效地执行 OLTP(在线事务处理)和 OLAP(在线分析处理)工作负载。
- 这减少了维护多个不同类型的数据库系统的需求,简化了架构并降低了成本。
-
云原生:
- TiDB 可以部署在物理机、虚拟机、容器或云端环境中,具有良好的云原生特性。
- 它与 Kubernetes 等容器编排工具集成良好,便于管理和自动化运维。
-
生态丰富:
- TiDB 拥有活跃的开源社区,提供了丰富的插件和工具,例如备份恢复工具 BR、数据同步工具 DM、监控工具 Prometheus + Grafana 等。
- 社区和官方文档资源丰富,易于学习和使用。
-
多数据中心部署:
- TiDB 支持跨多个数据中心部署,这有助于提高灾难恢复能力和地理冗余度。
1.2 TiDB 架构概览
- TiDB Server:负责处理 SQL 请求、优化查询计划和与客户端通信。它是无状态的,可以横向扩展。
- PD (Placement Driver):管理元数据、调度任务和分配全局唯一 ID。PD 是整个集群的大脑,确保数据分布合理且高效。
- TiKV:是一个分布式键值存储引擎,负责持久化存储数据,并实现了 MVCC(多版本并发控制)以支持 ACID 事务。
- TiFlash:是 TiDB 的列式存储引擎,主要用于加速 OLAP 查询。它与 TiKV 结合使用,提供 HTAP 能力。
1.3 使用场景
- 金融行业:需要高可用性和强一致性的交易系统。
- 互联网应用:面对大量用户请求,要求快速响应和灵活扩展的应用。
- 数据分析:实时处理海量数据并进行复杂查询分析的场景。
- 物联网 (IoT):处理来自众多设备的数据流,要求高吞吐量和低延迟。
2. 安装
下载tidb镜像或者导入tidb镜像
# 下载tidb镜像
docker pull xuxuclassmate/tidb# 导入tidb镜像
# docker load -i 文件名.tar.gz
# cat 文件名.tar.gz | docker load
docker load -i tidb.tar.gz
启动容器
docker run --name=tidb -d --privileged=true -p 4000:4000 xuxuclassmate/tidb
3. SQL语句
SQL的英文是Structured Query Language,简称SQL,是一种操作关系型数据库的结构化查询语言。操作数据库,最经常使用就是查询操作。
1、TiDB数据库的SQL语句不区分大小写,关键字建议使用大写;
2、SQL语句可以使用单行或多行书写,以分号结尾
3、注释
单行注释
- 单行注释# 单行注释
多行注释
/*
多行注释
多行注释
*/
4. SQL分类
分类 | 说明 | 作用 | 备注 |
---|---|---|---|
DDL | 数据定义语言 | 用来对数据库、表、列的定义 | data definition language |
DML | 数据操作语言 | 用来对数据库中表的数据进行增、删、改操作 | data manipulation language |
DQL | 数据查询语言 | 用来对数据库中表的数据进行查询 | data query language |
DCL | 数据控制语言 | 用来对数据库的控制(用户创建、权限控制) | data control language |
5. DDL
5.1 库的DDL
一个功能,一般都是四个动作,增删改查。
展示所有的数据库
show databases;
创建数据库
create database 数据库名称 charset=utf8;
create database if not exists 数据库名称 charset=utf8; # 使得SQL语句更加强健、健壮。
示例:
create database db1 charset=utf8;
create database if not exists db1 charset=utf8;
删除数据库
drop database 数据库名称;
drop database if exists 数据库名称;
示例:
drop database test;
drop database if exists test;
使用数据库
use 数据库名称;
查询正在使用的数据库
select database();
小结:
命令 | 作用 | 示例 |
---|---|---|
show databases; | 查看所有数据库 | show databases; |
create database if not exists 数据库名 charset=utf8; | 创建数据库 | create database if not exists db1 charset=utf8; |
use 数据库名; | 使用数据库 | use db1; |
select database(); | 查看当前使用的数据库 | select database(); |
drop database if exists 数据库名; | 删除数据库 | drop database if exists db1; |
5.2 表、列的DDL
列的内容可以是数字、字符串、时间等,由数据类型约束
在满足业务需求的请求下,数据类型范围选择越小的。
数值数据类型
数据类型 | 字节数 | 有符号 | 无符号 |
---|---|---|---|
tinyint | 1个字节 | -128~127 | 0~255 |
smallint | 2个字节 | -32768~32767 | 0~65535 |
mediumint | 3个字节 | -8388608~8388607 | 0~16777215 |
int | 4个字节 | -2147483648~2147483647 | 0~4294967295 |
bigint | 8个字节 | -263~263-1 | 0~2^64-1 |
float | 单精度,4个字节 | -231~231-1 | 0~2^32-1 |
double | 双精度,8个字节 | ||
decimal[M, D] | 双精度,8个字节 |
decimal(5,2),表示共5位数字,其中2位是小数,比如:888.88
字符串数据类型
数据类型 | 长度 | 用途 |
---|---|---|
char(size) | 最大255个字符 | 数据是定长,如md5的密码,邮编,手机号,身份证号等 |
varchar(size) | 最大65535个字节 | 存放一般内容长度 |
tinytext | 最大255个字节 | |
text | 最大65535个字节 | |
mediumtext | 最大16777215个字节 | 大段文本时,如新闻、文章、论文等 |
longtext | 最大4294967295个字节 | 大段文本时,如新闻、文章、论文等 |
1、VARCHAR(size):0~65535字节 可变长度字符串,最大65532字节,1-3个字节用于记录大小【utf8编码size最大21844字符,gbk编码最大32766字符 】
2、查询速度:char > varchar
3、text与char、varchar不同的是,text不可以有默认值,能用varchar的地方不用text
日期+时间数据类型
数据类型 | 格式 |
---|---|
date | 年-月-日,如:2024-4-8 |
datetime | 年-月-日 时:分:秒,如:2024-4-8 16:17:40 |
timestamp | 年-月-日 时:分:秒,如:2024-4-8 16:17:40 |
time | 时:分:秒,如:16:17:40 |
year | 年,如:2024 |
datetime保存时间的范围: 1000-01-01 00:00:00
到 9999-12-31 23:59:59
timestamp保存时间的范围: 1970-01-01 00:00:01
到 2038-01-19 03:14:07
展示当前数据库所有表
show tables;
描述表结构
desc 表名;
查看表的创建语句
show create table 表名;show create table user;
创建表
create table 表名(字段名1 数据类型,字段名2 数据类型,...字段名n 数据类型 # 最后一个不需要逗号(,)
);示例:
create table if not exists user(id tinyint,username varchar(32),age tinyint
);
删除表
drop table 表名称;
drop table if exists 表名称;
修改表、列
# 修改表名
alter table 原来的表名 rename to 新的表名;示例:
alter table user rename to users;# 增加一列
alter table 表名 add 列名 数据类型;示例:
alter table users add height float;# 修改列数据类型
alter table 表名 modify 列名 新数据类型;示例:
alter table users modify id int;# 修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型;示例:
alter table users change id no tinyint;# 删除列
alter table 表名 drop 列名;示例:
alter table users drop height;
小结:
命令 | 作用 |
---|---|
show tables; | 查看当前数据库中所有表 |
desc 表名; | 查看表结构 |
show create table 表名; | 查看表的创建语句 |
alter table 表名 rename to 新的表名; | 修改表名 |
alter table 表名 add 列名 类型; | 添加字段 |
alter table 表名 modify 列名 类型及约束; | 修改字段数据类型 |
alter table 表名 change 原名 新名 类型及约束; | 修改字段名和数据类型 |
alter table 表名 drop 列名; | 删除字段 |
drop table 表名; | 删除表 |
6. DML
6.1 添加数据
添加指定列数据
insert into 表名(列名1,列名2...) values(值1,值2...);
添加全部列数据
insert into 表名 values(值1,值2...);示例:
insert into users values(1, 'zhangsan', 18);
批量添加指定列数据
insert into 表名(列名1,列名2...) values(值1,值2...),(值1,值2...)...;
批量添加全部列数据
insert into 表名 values(值1,值2...),(值1,值2...)...;示例:
insert into users values(1, 'lisi', 18),(1, 'wanger', 19);
6.2 修改数据
修改表数据
update 表名 set 列名1=值1 列名2=值2...[where条件];示例:
update users set no=2 where username='lisi';
注:如果不加where条件,就是对该表所有行内容进行修改
6.3 删除数据
删除表数据
delete from 表名 [where条件]示例:
delete from users where username='wanger';
注:如果不加where条件,就是对该表所有行内容进行删除
7. DQL
完整语法
SELECT字段列表
FROM表名列表
WHERE条件列表
GROUP BY分组字段
HAVING分组后条件
ORDER BY排序字段
LIMIT分页限定
- 创建数据库
create database if not exists db1- 创建数据库表
use db1;create table if not exists stu(id int(11),username varchar(32),sex tinyint(1),age tinyint(3),math tinyint(3),chinese tinyint(3)
);- 添加数据
insert into stu values(1,'小张',1,16,75,86),(2,'小李',1,16,76,86),(3,'小王',0,17,76,87),(4,'小胡',0,17,77,87),(5,'小丘',0,18,77,88),(6,'小刘',0,18,80,90);
7.1 基础查询
- 查询指定字段
select id,username from stu;- 查询表所有字段
select * from stu;- 去除重复记录
select distinct sex from stu;- 字段取别名
select id,sex as gender,math shuxue from stu;
7.2 条件查询
select 字段列表 from 表名 where条件
where后面支持多种运算符
运算符 | 功能描述 |
---|---|
比较运算符 | =、>、>=、<、<=、!=、<> |
逻辑运算符 | and、&&、or、||、not |
模糊查询 | like |
范围查询 | between…and…、in(…) |
空判断 | is null、is not null |
模糊查询使用like关键字,可以使用通配符进行占位
_:代表单个任意字符
%:代表任意个字符
正则表达式
select * from stu where class_id REGEXP '1|7';
7.3 排序查询
select 字段列表 from 表名 order by 排序字段名1 [,排序字段2]...;
注:排序方式有上序ASC,降序DESC,默认情况下是升序ASC
select * from stu order by math desc,chinese desc;
7.4 聚合函数
在进行查询操作时,往往需要对一整列进行运算,例如成绩的平均分
函数名 | 功能 |
---|---|
count(列名) | 统计数量(一般选用不为null的列) |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
select 聚合函数 from 表名;
注:NULL值不参与聚合函数运算
7.5 分组查询
select 字段列表 from 表名 [where分组前的条件限定] group by 分组字段名 [having 分组后的条件过滤];
注:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
select sex,max(math),max(chinese) from stu group by sex;
7.6 分页查询
select 字段列表 from 表名 limit 查询起始索引,查询条目数
注:limit关键字中,查询起始索引是从0开始的
8. 约束
约束是作用于数据库表中列上的规则,用于限制添加数据的行为。从而保证数据库中数据的正确性、有效性和完整性。
8.1 约束分类
约束类型 | 关键字 | 功能 |
---|---|---|
非空约束 | NOT NULL | 保证列中所有数据不能有NULL值 |
唯一约束 | UNIQUE | 保证列中所有数据各不相同 |
主键约束 | PRIMARY KEY | 主键是一行数据的唯一标识,要求非空且唯一 |
默认约束 | DEFAULT | 保存数据时,未指定值则采用默认值 |
外键约束 | FOREIGN KEY | 外键用来让两个表数据建立关联,保证数据的一致性和完整性 |
检查约束 | CHECK | 保证列中的值满足某一条件 |
create table if not exists stu(id int(11) unsigned auto_increment primary key not null,username varchar(32) not null unique,sex tinyint(1) default 1 not null,age tinyint(3) not null,math tinyint(3) default 0 not null,chinese tinyint(3) default 0 not null
);
9. 多表查询
一次性从多张表中查询需要的数据
create table class(class_id int(11) unsigned auto_increment primary key not null,class_name varchar(32) not null unique
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;create table stu(stu_id int(11) unsigned auto_increment primary key not null,class_id int(11) not null,stu_name varchar(32) not null unique
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;insert into class(class_name) values('一班'),('二班');insert into stu(class_id,stu_name) values(1,'小张'),(1,'小李'),(2,'小孙'),(2,'小杨');
在MySQL中多表查询分为连接查询和子查询,连接查询又分为内连接和外连接,内连接又分为隐式内连接和显示内连接,外连接又分为左外连接和右外连接。
9.1 内连接查询
- 隐式内连接查询
select 字段列表 from 表1,表2... where 条件;- 显式内连接查询
select 字段列表 from 表1 [inner] join 表2 on 条件;
示例
- 隐式内连接查询
select * from class,stu where class.class_id=stu.class_id;- 显式内连接查询
select * from class inner join stu on class.class_id=stu.class_id;
9.2 外连接查询
左外连接查询:相当于查询A表所有数据和交集部分数据
右外连接查询:相当于查询B表所有数据和交集部分数据
- 左外连接查询
select 字段列表 from 表1 left [outer] join 表2 on 条件;- 右外连接查询
select 字段列表 from 表1 right [outer] join 表2 on 条件;
示例
select * from stu left outer join class on stu.class_id=class.class_id;select * from stu right outer join class on stu.class_id=class.class_id;
9.3 子查询
指查询中嵌套有查询
子查询语句结果是单行单列,子查询语句作为条件值,使用>、>=、<、<=、=、!=等进行条件判断。
# class_id 大于 1班的class_id的学生
select * from stu where class_id > (select class_id from class where class_name='一班');
子查询语句结果是多行单列,子查询语句作为条件值,使用in等关键字进行条件判断
# 查询存在班级的学生
select * from stu where class_id in (select class_id from class);
子查询语句结果是多行多列,子查询语句作为虚拟表
select * from stu,(select * from class) c where stu.class_id=c.class_id;
10. 事务
使用场景:转账、下单扣库存
语法:
# 开启事务
start transaction;
或
begin;-- 执行各种操作# 回滚事务
rollback;# 提交事务
commit;
事务特征:
1、原子性,事务是不可分割最小操作单位,要么同时成功,要么同时失败
2、一致性,事务完成时,必须使所有数据都保持一致状态
3、隔离性,多个事务之间,操作可见性
4、持久性,事务一旦提交或回滚,它对数据库中数据的改变是永久的
10.1 隔离级别
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。在事务的并发操作中可能会出现脏读,不可重复读,幻读。
读未提交(Read uncommitted):
解释:
一个事务读到了另一个事务还没有提交的数据。
例如:
A给B转账,
A转给B,10万,点转账,但未点确认
B查账户看到10万
A及时发现,点撤回,修改为1万,再点转账,再点确认
分析:
A给B最终转账是1万,但是在过程中,B能看到过程数据。这就是脏读。
读已提交(Read committed):
解释:
一个事务要等另一个事务提交后才能读取数据。
例如:
父亲的银行卡有10万
儿子拿着这个银行卡去买单,同时父亲准备转款(开启事务)。此时儿子看到银行卡里有10万
等儿子看完有10万后,钱被父亲转走,并提交
收费系统准备在这个银行卡扣款,再次检测,发现卡里没有钱了
分析:
这就是读已提交,若有事务对数据进行更新操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。
这个例子中,有读两次卡里的钱,一次是10万,一次是没有钱了,这就是不可重复读。
可重复读(Repeatable read):
解释:
同一事务下,事务在执行期间,多次读取同一数据时,能够保证读取到的数据是一致的。
例如:
父亲的银行卡有10万
儿子拿着这个银行卡去买单,此时儿子看到银行卡里有10万,这个时候父亲想转账,发现转不了
等儿子买完单,父亲才能够实行转账行为
分析:
读数据的时候,不允许该数据有写数据的事务。因为写数据会改变数据。这样子就解决了不可重复读的问题。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
什么时候会出现幻读?
解释:
一个事务读取到了另一个事务新增的数据
例如:
儿子某一天去消费,花了8千元,然后他的父亲去查看他今天的消费记录(全表扫描,儿子事务开启),看到确实是花了8千元,就在这个时候,儿子花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当父亲打印儿子的消费记录清单时(儿子事务提交),发现花了1.8万元,似乎出现了幻觉,这就是幻读。
串行化(Serializable):
解释:
它是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率最低,比较耗费数据库性能,一般不推荐使用。
小结:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 可能出现 | 可能出现 | 可能出现 |
读已提交 | 不会出现 | 可能出现 | 可能出现 |
可重复读 | 不会出现 | 不会出现 | 可能出现 |
串行化 | 不会出现 | 不会出现 | 不会出现 |
隔离级别查询
-- MySQL8以前
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;-- MySQL8开始
SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;
修改隔离级别
-- 建议开发者在修改时,仅修改当前session隔离级别即可
-- REPEATABLE-READ,MySQL默认级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE-READ
11. 函数
11.1 数学函数
函数 | 含义 |
---|---|
abs(x) | 返回x的绝对值 |
rand() | 返回0到1的随机数 |
mod(x,y) | 返回x除以y以后的余数 |
power(x,y) | 返回x的y次方 |
round(x) | 返回离x最近的整数 |
round(x,y) | 保留x的y位小数四舍五入后的值 |
sqrt(x) | 返回x的平方根 |
truncate(x,y) | 返回数字 x 截断为 y 位小数的值 |
ceil(x) | 返回大于或等于 x 的最小整数 |
floor(x) | 返回小于或等于 x 的最大整数 |
greatest(x1,x2…) | 返回返回集合中最大的值 |
least(x1,x2…) | 返回返回集合中最小的值 |
11.2 字符串函数
函数 | 含义 |
---|---|
trim() | 返回去除指定格式的值 |
concat(x,y) | 将提供的参数 x 和 y 拼接成一个字符串 |
substr(x,y) | 获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同 |
substr(x,y,z) | 获取从字符串 x 中的第 y 个位置开始长度为z 的字符串 |
length(x) | 返回字符串 x 的长度 |
replace(x,y,z) | 将字符串 z 替代字符串 x 中的字符串 y |
upper(x) | 将字符串 x 的所有字母变成大写字母 |
lower(x) | 将字符串 x 的所有字母变成小写字母 |
left(x,y) | 返回字符串 x 的前 y 个字符 |
right(x,y) | 返回字符串 x 的后 y 个字符 |
repeat(x,y) | 将字符串 x 重复 y 次 |
space(x) | 返回 x 个空格 |
strcmp(x,y) | 比较 x 和 y,返回的值可以为-1,0,1 |
reverse(x) | 将字符串 x 反转 |
11.3 日期函数
函数 | 含义 |
---|---|
current_date() | 当前日期 |
current_time() | 当前时间 |
current_timestamp() | 当前时间戳 |
12. DCL
12.1 用户管理
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
-- 实例:
CREATE USER 'java'@'%' IDENTIFIED BY 'asd123crl';
删除用户
drop user 用户名@IP;
-- 实例:
drop user 'java'@'%';
修改密码
UPDATE `user` SET `Password` = PASSWORD('新密码') WHERE `User` = '用户名';
-- 实例:
UPDATE `user` SET `Password` = PASSWORD('asd123') WHERE `User` = 'java';
12.2 权限管理
常用权限:
- 表数据: select, update, delete, insert
- 表结构: create, alert, drop
- 外键: references
- 创建临时表: create temporary tables
- 操作索引: index
- 视图: create view, show view
- 存储过程: create routine, alert routine, execute
- 所有权限: all
查看用户权限命令
SHOW GRANTS FOR '用户名'@'主机名';
-- 实例:
SHOW GRANTS FOR 'root'@'%';
给用户授予权限
在MySQL中使用GRANT命令给用户授权,如果用户不存在,GRANT会自动创建用户,并进行授权。
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; -- 权限列表中如果有多个权限则用逗号,隔开-- 授权所有库的所有表的所有权限
GRANT ALL ON *.* TO '用户名'@'主机名';
-- 示例:给张三赋予db_test数据库students表的查询权限
GRANT SELECT ON db_test.students TO 'zhangsan'@'localhost';
-- 刷新权限
flush privileges
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
-- 示例:撤销张三在db_test.students表的查询权限
REVOKE SELECT ON db_test.students FROM 'zhangsan'@'localhost';
-- 刷新权限
flush privileges
13. 备份与还原
备份语法:
mysqldump -h 服务器 -u 用户名 -p -B 数据库名1 数据库2 数据库n > 备份文件.sql
示例:
mysqldump -u root -p -B test > /backup/123.sql
还原语法:
mysqldump -h 服务器 -u 用户名 -p密码 --databases 数据库名 < 备份文件.sql# 进入数据库后
source 备份文件.sql;
示例:
mysqldump -u root -p --databases test < /backup/123.sql
一般系统推荐的字符集和排序规则
# 字符集
utf8mb4# 排序规则,不区分大小写
utf8mb4_general_cli
字符集(Character Set):utf8mb4
排序规则 | 字符序(Collate):utf8mb4_general_cli 或 utf8mb4_bin
相关文章:
国产数据库TiDB从入门到放弃教程
国家层面战略,安全的角度,硬件、软件国产化是趋势,鸿蒙电脑操作系统、鸿蒙手机操作系统…数据库也会慢慢国产化,国产数据库TiDB用起来比OceanBase丝滑,本身没有那么重。 从入门到放弃 1. 介绍1.1 TiDB 的主要特点1.2 T…...
Android 自定义控件
目录 Android 自定义控件 一、什么是自定义控件 二、创建自定义控件的常见方式 2.1继承现有控件(如 Button、TextView 等) 2.2直接继承 View 类 2.3组合控件 三、自定义控件的基本步骤 3.1创建一个继承自 View 或现有控件的类 3.2重写 onDraw()…...
学习笔记 --C#基础其他知识点(同步和异步)
C#中的同步和异步《一》 以下理解借鉴博客:借鉴博客地址1 异步编程(Asynchronous) 允许任务在后台执行,而不会阻塞调用线程。C#使用async和await关键字 async Task AsynchronousMethod() {// 等待异步操作完成await Task.Dela…...
药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整
药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整 有缺陷的标注信息: 无缺陷的标注信息 数据集下载: yolov11:https://d…...
Hive如何创建自定义函数(UDF)?
目录 1 自定义UDF函数基础 2 自定义UDF函数案例 3 创建临时函数 4 创建永久函数 1 自定义UDF函数基础 1. 内置函数:Hive 自带了一些函数...
深入理解MVCC:快照读与当前读的原理及实践
一、引言 MVCC是数据库系统中一种常见的并发控制技术,它允许多个事务同时对同一数据进行读取和修改,而不会相互干扰。在MVCC中,数据行存在多个版本,每个版本对应一个事务。本文将重点讨论MVCC中的两种读取方式:快照读…...
活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识
课程介绍 参加“Azure 在线技术公开课:数据基础知识”活动,了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动,你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间:01 月 07 日…...
小程序笔记
1.小程序全局配置app.json {"pages":["pages/index/index","pages/logs/logs"],"window":{"backgroundTextStyle":"light","navigationBarBackgroundColor": "#fff","navigationBarTit…...
linux安装nginxs报错:openssl not found
系统: linux 版本:centOS7 nginx版本:nginx-1.20.2 linux安装nginx时 执行下面命令时报错: ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …...
Vite内网ip访问,两种配置方式和修改端口号教程
目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…...
地理数据库Telepg面试内容整理-如何在高并发情况下保证GIS服务的高可用性?
在高并发情况下,保证 GIS 服务的高可用性是一个重要的挑战,尤其是当空间数据量巨大、请求频繁时。为了确保 GIS 服务的高可用性和稳定性,需要考虑以下几个方面: 分布式架构设计 分布式架构通过将工作负载分配到多个服务器上,能够大大提高服务的可用性和扩展性。通过设计高…...
ES中查询中参数的解析
目录 query中参数match参数match_allmatch:匹配指定参数match_phrase query中其他的参数query_stringprefix前缀查询:wildcard通配符查询:range范围查询:fuzzy 查询: 组合查询bool参数mustmust_notshould条件 其他参数 query中参数 词条查询term:它仅匹配在给定字段…...
【Java 数据结构】合并两个有序链表
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 1. 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示…...
OpenCV-Python实战(8)——图像变换
一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…...
深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
阅读原文 渐入佳境 我们都知道,通过编写一个提示词(prompt),我们可以引导大模型生成回答,从而开启愉快的人工智能对话,比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程,我们拆成两部分 pr…...
GXUOJ-算法-第二次作业(矩阵连乘、最长公共子序列、0-1背包问题、带权区间调度)
1.矩阵连(链)乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…...
生态碳汇涡度相关监测与通量数据分析实践技术应用
1.以涡度通量塔的高频观测数据为例,基于MATLAB开展上机操作: 2.涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3.涡度通量数据质量控制:通量数据异常值识别与剔除等 4.涡度通量数据缺失插补:结合气象数据…...
使用OpenAI、LangChain、MongoDB构建一个AI agent
LangChain真是好起来了。24年中的时候用LangChain V2差点把我气死,现在V3用起来开始真香了~ 像 ChatGPT、Gemini 和 Claude 这样的大模型已成为企业必不可少的工具。如今,几乎每家公司都希望根据自己的需求或客户群体,开发一款定制化的AI Age…...
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…...
【ETCD】【实操篇(十九)】ETCD基准测试实战
目录 1. 设定性能基准要求2. 使用基准测试工具基准测试命令 3. 测试不同的负载和场景4. 监控集群性能5. 评估硬件和网络的影响6. 对比性能基准7. 负载均衡和容错能力测试8. 优化与调优9. 测试在高负载下的表现总结 1. 设定性能基准要求 首先,明确集群性能的目标&am…...
HTML——29. 音频引入二
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频IE8以及之前版本不支持属性名和属性值一样,可以只写属性名src属性:指定音频文件…...
【SQLi_Labs】Basic Challenges
什么是人生?人生就是永不休止的奋斗! Less-1 尝试添加’注入,发现报错 这里我们就可以直接发现报错的地方,直接将后面注释,然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…...
InnoDB存储引擎对MVCC的实现
多版本并发控制 (Multi-Version Concurrency Control) MVCC(Multi-Version Concurrency Control),即多版本并发控制,是一种并发控制方法,主要用于数据库管理系统中实现对数据库的并发访问。以下是MVCC的详细解释&#…...
3D线上艺术展:艺术与技术的完美融合
随着数字技术的飞速发展,未来的艺术展览正逐步迈向线上线下融合的新阶段。其中,3D线上展览以其独特的魅力,成为线下展览的延伸与拓展,为艺术爱好者们开辟了全新的观赏途径。 对于艺术家和策展人而言,3D线上展览不仅打…...
EasyExcel(读取操作和填充操作)
文章目录 1.准备Read.xlsx(具有两个sheet)2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …...
【CSS in Depth 2 精译_095】16.3:深入理解 CSS 动画(animation)的性能
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...
目前最流行的 Rust Web 框架有哪些?
目前最流行的 Rust Web 框架有哪些? 1. Actix Web:高性能之王,老牌框架 特点: 高性能:基于 Actor 模型,是目前 Rust 生态中最成熟、性能最强的 Web 框架之一。功能强大:支持 HTTP/1.x、HTTP/2、WebSocket 等,内置中间件和多种插件。社区支持广泛:拥有大量使用者,资料…...
连锁餐饮行业数据可视化分析方案
引言 随着连锁餐饮行业的迅速发展,市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势,以制定科学合理的决策,提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据,通过直观、动态的可…...
如何通过采购管理系统提升供应链协同效率?
供应链是企业运营的命脉,任何环节的延迟或失误都会对企业造成严重影响。在采购环节中,如何保证与供应商的协同效率,避免因信息不对称而导致的决策失误,是企业面临的一大挑战。采购管理系统作为数字化供应链管理的重要工具…...
1、Jmeter、jdk下载与安装
1、访问官网,点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间,下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好,先安装JDK : ListBuffer[BookModel] {val books new ListBuffer[BookModel](…...
Java 类加载机制
什么是类 类是现实世界的实体在计算中的映射、它将数据以及对这些数据的操作封装在一起。 类加载的定义 类加载是 JVM 运行时的一个动作、支持将 class 动态加载到 JVM 中 类加载是一种懒加载模式、按需加载。 类加载到五个过程 加载验证准备解释初始化 提一点࿰…...
Lombok是银弹?还是陷阱?
Lombok 是一个 Java 库,它通过注解简化和减少了 Java 中的样板代码(boilerplate code),例如 getter/setter 方法、构造函数、equals 和 hashCode 方法等。 对于是否将 Lombok 视为“银弹”或“陷阱”,这实际上取决于你…...
大数据技术-Hadoop(四)Yarn的介绍与使用
目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler(容量调度器) 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…...
CentOS修改docker镜像存储位置并进行数据迁移
在 CentOS 上修改 Docker 镜像存储位置并进行数据迁移是一个常见的需求。以下是一个详细的步骤指南,帮助你完成这个任务。 1. 停止 Docker 服务 首先,确保 Docker 服务已经停止,以避免在迁移过程中出现数据损坏。 sudo systemctl stop doc…...
xterm + vue3 + websocket 终端界面
xterm.js 下载插件 // xterm npm install --save xterm// xterm-addon-fit 使终端适应包含元素 npm install --save xterm-addon-fit// xterm-addon-attach 通过websocket附加到运行中的服务器进程 npm install --save xterm-addon-attach <template><div :…...
解锁 CSS:网页美化与布局的艺术
目录 一、CSS 是什么 二、CSS 的作用 三、CSS 的应用方式(引用方式) 四、选择器:如何挑选要 “打扮” 的元素 五、CSS 属性:丰富多样的 “服装款式” 字体属性: 文本属性:只能控制文字的相关样式。 …...
AWS K8s 部署架构
Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…...
【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识
前言 在iOS开发中Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才…...
电子电器架构 --- HUD的工作原理
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)
有一个winform项目,需要借助一个web项目来显示,并且对web做一些操作,web页目是需要用谷歌内核,基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。 安装步骤 第一步:右键项目,点击 管理NuGet程序包 , 输…...
FFmpeg 中 examples 使用教程
FFmpeg 中 examples FFmpeg 的 examples 目录包含了一系列示例程序,旨在展示如何使用 FFmpeg 的不同库和 API。这些示例涵盖了多种功能,包括音视频编解码、格式转换、过滤、网络传输等。以下是一些常见的示例程序及其功能介绍: 音频和视频解码: 示例程序展示了如何打开音视…...
自动化办公-合并多个excel
在日常的办公自动化工作中,尤其是处理大量数据时,合并多个 Excel 表格是一个常见且繁琐的任务。幸运的是,借助 Python 语言中的强大库,我们可以轻松地自动化这个过程。本文将带你了解如何使用 Python 来合并多个 Excel 表格&#…...
Docker搭建MySQL
Docker搭建MySQL 准备工作 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/mysql/{conf,data,log}准备配置文件*.cnf,放到/opt/module/mysql/conf目录下。当然不准备也没事,容器中有个默认配置:/etc/mysql/conf.d/m…...
亚马逊国际站商品爬虫:Python实战指南
在数字化时代,数据的价值不言而喻。对于电商领域而言,获取竞争对手的商品信息、价格、评价等数据,对于市场分析和策略制定至关重要。本文将带你了解如何使用Python编写爬虫,以亚马逊国际站为例,按照关键字搜索并获取商…...
pwntools用法
pwntools 是一个Python库, 用于编写二进制漏洞利用(exploitation)脚本 功能: 远程连接和本地连接: 支持通过TCP/UDP连接远程服务或与本地进程进行交互。Shellcode和ROP链构造: 提供了便捷的工具来生成和利…...
企业云盘怎么选?2024年免费版9款整理
文章介绍了以下9大企业云盘:1.亿方云;2.Worktile;3.百度网盘;4.腾讯云盘;5.阿里云盘;6.金山云盘;7.Dropbox;8.Box。 在企业日常管理中,文件存储和共享一直是个不小的难题…...
Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验
一,启动文件 .global _start .global _bss_start /* 类似宏定义把__bss_start定义为_bss_start */ _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:#设置处理器进入SVC模式mrs r0, cpsr /* 读取cpsr到r0 */bic r0, r0, …...
Qt从入门到入土(七)-实现炫酷的登录注册界面(下)
前言 Qt从入门到入土(六)-实现炫酷的登录注册界面(上)主要讲了如何使用QSS样式表进行登录注册的界面设计,本篇文章将介绍如何对登录注册界面进行整体控件的布局,界面的切换以及实现登录、记住密码等功能。…...
如何进行年度工作回顾?
发生了什么事? 什么事情进展顺利 ? 什么事情进展不顺利? 如何适应未来? 年度回顾的定义:这是一种战略工具,能帮助人们清晰看到过去一年对业务、职业或个人生活的影响,可用于明确关键事件、找出问…...