Skip to content

Commit

Permalink
mysql1 install
Browse files Browse the repository at this point in the history
  • Loading branch information
yk committed Dec 5, 2023
1 parent cd10b61 commit 4630214
Show file tree
Hide file tree
Showing 2 changed files with 215 additions and 4 deletions.
215 changes: 213 additions & 2 deletions content/posts/mysql/mysql_1.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,227 @@ weight: 1
![](https://cdn.jsdelivr.net/gh/yokiizx/picgo@main/img/202311301709918.png)

## 起停

```shell
# 基本命令
sudo /usr/local/mysql/support-files/mysql.server start
sudo /usr/local/mysql/support-files/mysql.server restart
sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server status # 查看状态
```

环境配置,我本地使用的 `.zshrc`:
环境配置,简化命令:

```shell
# .zshrc
export MYSQL_HOME=/usr/local/mysql
export PATH=${PATH}:${MYSQL_HOME}/support-files # 之前配置了很多,拼进去${MYSQL_HOME}/support-files即可
export PATH=$MYSQL_HOME/support-files:$MYSQL_HOME/bin:$PATH # 按需配置

sudo mysql.server start
sudo mysql.server restart
sudo mysql.server stop
```

## 登录

```shell
# 登录
mysql [-h 主机] [-P 端口] -u 用户 -p 密码 # mysql 端口默认 3306
# 退出
exit
```

也可使用图形化软件进行连接,我选择了 `DataGrip`,当然也可以使用 `navicat`

### Access denied for user 'root'@'localhost'

解决办法:

```shell
# 1. 先停止服务
sudo mysql.server stop
# 2. 进入 mysql 二进制执行文件目录
cd /usr/local/mysql/
# 3. 获取管理员权限
sudo su
# 4. 输入 ./mysqld_safe --skip-grant-tables & 然后回车,禁止mysql验证功能,mysql会自动重启
# 5. cmd + T 新开 tab,并登录
mysql -u root -p
```

## mysql 的三层结构

- DBMS(database manage system)
- db,dbms 下可以用有个 db
- table,db 下可以有多个 table

> 普通的表本质是真真实实的文件。
## sql 语句分类

- DDL,data definition language,数据定义语句,[create,alter 表,库...]
- DML,data manipulation language,数据操纵语句,[insert, update, delete]
- DQL,data query language,数据查询语句 [select]
- DCL,data control language,数据控制语句 [管理数据库,grant,revoke]

> 注意,在 mysql 的控制台环境下语句要以分号 `;` 结尾
### 数据库

```sql
# 创建
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset_name] [COLLATE collation_name]
# 使用
use db_name
# 删除
DROP DATABASE [IF EXISTS] db_name
# 查看所有数据库
SHOW DATABASES

# 查看数据库创建时的语句
SHOW CREATE DATABASE db_name
```

1. 为了规避关键字,可以使用反引号包裹 `db_name`
2. IF NOT EXISTS,如果加上了,当创建 db 的时候如果已经存在,就不会创建也不报错,如果没有加上则会报错
3. 字符集 charset_name 默认为 utf8
4. 校对规则 collation_name 默认为 utf8_general_ci(不区分大小写);还有 utf8_bin(区分大小写)等
5. 当创建表时没有指定字符集和校对规则,就会默认使用数据库上的配置

#### 备份数据库

```sql
# 备份
mysqldump -u root -p -B <db_1> [db_2] ... > <target_path/xxx.sql>
mysqldump -u root -p <db_1> [table_1] ... > <target_path/xxx.sql> # 不用 -B 可以指定数据库下的表
# 还原, 进入 mysql 命令行
source target_path/xxx.sql
```

###

```sql
# 创建 字符集和校对规则不指定就默认使用数据库的
CREATE TABLE tb_name (filed dataType, ...) [CHARACTER SET charset_name] [COLLATE collation_name] ENGINE 存储引擎

# 删除
DROP TABLE tab_name

# 修改
## 修改表名
RENAME TABLE old_tb_name TO new_tb_name
## 修改字符集
ALTER TABLE tb_name Character set 字符集
## 新增列
ALTER TABLE tb_name ADD (col_name col_type [DEFAULT expr], ...)
## 修改列
ALTER TABLE tb_name MODIFY (col_name col_type [DEFAULT expr], ...)
## 修改列名
ALTER TABLE tb_name CHANGE [column] old_col_name new_col_name new_col_type
## 删除列
ALTER TABLE tb_name DROP (col_name, ...)

# 查看表结构
DESC tb_name [-- 指定列]
```

修改列属性可以用 modify,但是修改列名只能用 change。

#### 常用数据类型

| 分类 | 数据类型 | 说明 |
| ---------- | --------------------------------- | ------------------------------------------------------------------------------ |
| 数值类型 | BIT(M) | 位类型,M 指定位数,默认为 1,范围 1 ~ 64。 |
| | TINYINT 1 个字节 | 无符号:[0,2 ** 8-1],有符号:[-2 ** 7,2 ** 7-1],默认有符号 |
| | SMALLINT 2 个字节 | 无符号:[0,2 ** 16-1],有符号:[-2 ** 15,2 ** 15-1] |
| | MEDIUMINT 3 个字节 | 无符号:[0,2 ** 24-1],有符号:[-2 ** 23,2 ** 23-1] |
| | INT 4 个字节 | 无符号:[0,2 ** 32-1],有符号:[-2 ** 31,2 ** 31-1] |
| | BIGINT 8 个字节 | 无符号:[0,2 ** 64-1],有符号:[-2 ** 63,2 ** 63-1] |
| | | |
| | FLOAT 4 个字节 | |
| | DOUBLE 8 个字节 | |
| | DECIMAL(M,D),m 默认 10,d 默认 0 | M 指定长度,D 指定小数点后面的位数 ,M 最大 65,D 最大 30 |
| ---------- | ---------- | ---------- |
| 文本类型 | CHAR(size) | 固定长度字符串,最大为 255 个`字符` |
| | VARCHAR(size) | 可变长度字符串,最大 65535 (2\*\*16-1) 个`字节`,使用 1-3 个字节记录内容长度 |
| | TEXT | 2\*\*16-1 个字节 |
| | LONGTEXT | 2\*\*32-1 个字节 |
| ---------- | ---------- | ---------- |
| 时间日期 | DATE | 日期 |
| | TIME | 时间 |
| | DATETIME | 日期+时间 |
| | TIMESTAMP | 可以自动记录 UPDATE,INSERT 的时间 |
| ---------- | ---------- | ---------- |
| 二进制类型 | BLOB | 2\*\*16-1 个字节 |
| | LONGBLOB | 2\*\*32-1 个字节 |

##### 数值类型设置无符号

创建时在类型后添加 `unsigned` 关键字。

##### char 和 varchar

首先,char(size) 和 varchar(size)里的 size,都是指 `字符的长度`,最大的区别是一个固定字符长度就确定了空间大小,一个是根据实际使用大小来确定的。

- char的size最大字符数为255,定长的使用场景,比如手机号,身份证号码等
- varchar的size最大字符数不一定,需要根据字符集来确定。比如utf8下最大字符数为 21844,
因为一个汉字3个字节,最大字节为 2**16-1 = 65535,再减去用于记录大小的 3 个字节,(65535-3)/3 = 21844.

查询速度 char > varchar

##### varchar 和 text

两种数据类型共享的最大长度为 65,535 个字符,但仍然存在一些差异:

1. VARCHAR 中的 VAR 表示您可以将最大大小设置为 1 到 65,535 之间的任何值。 TEXT 字段的最大固定大小为 65,535 个字符。
2. VARCHAR 可以是索引的一部分,而 TEXT 字段要求您指定前缀长度,该长度可以是索引的一部分。
3. VARCHAR 与表内联存储(至少对于 MyISAM 存储引擎而言),因此在大小合理时可能会更快。当然,快得多少取决于您的数据和硬件。同时,TEXT 存储在表外,该表具有指向实际存储位置的指针。
4. 排序使用 TEXT 列将需要使用基于磁盘的临时表作为 MEMORY(HEAP)存储引擎。

##### datetime 和 timestamp

创建 timestamp 时添加 `DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`,会自动初始化和更新,比如当行发生改变的时候就会自动更新

> 从 MySQL 5.6.5 开始,Automatic Initialization and Updating 同时适用于 TIMESTAMP 和 DATETIME,且不限制数量。
timestamp 客户端插入的时间从当前时区转化为 UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回,所以更适合跨时区业务。
DATETIME,不做任何改变,基本上是原样输入和输出。

timestamp 所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。
datetime 所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

---

### 插入语句

```sql
INSERT INTO tb_name [col_1,col_2,...] values (val1, val2,...) [,(...),(...)] # 中括号内为可选插入多条数据
```

> 1. 当插入一整条数据时,列名可以省略。无论什么时候,value 值都得和列名一一对应。
> 2. 字符和日期型数据应包含在单引号中。
### 更新语句

```sql
UPDATE tb_name SET col_name=expr[,col_name2=expr2,...] [WHERE condition]
```

> 没有指定 WHERE 子句,则更新对应列的所有行
### delete 语句

```sql
DELETE FROM tb_name [WHERE condition]
```

> 没有指定 WHERE 子句,MySQL 表中的所有记录将被删除
### 【核心】select 语句

```sql
SELECT [DISTINCT] *|{col1,col2,...} FROM tb_name
```

- DISTINCT,去重
4 changes: 2 additions & 2 deletions content/posts/tool/CommonJS和ESM.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ function require(id) {

## 总结 CJS 和 ESM 不同点

- CJS 是动态的,运行时决定各模块的关系,可以动态加载。本质上导出的 `module.exports` 属性,是值的拷贝。CJS 会对进行缓存,`require` 时会检查是否存在缓存,借助「模块缓存」来解决循环依赖的问题,每次加载到已经执行了的部分,再次加载时读取的是缓存,如果此时数据被改动,缓存中的数据也会改动。
- ESM 是静态的,编译时处理好各模块关系,不能动态加载。本质上输出的值的引用,可以混合导出。可以进行 tree-shaking。借助「模块地图」来解决循环依赖的问题,已经进入过的模块标注为获取中(pending),遇到 import 语句会去检查这个地图,已经标注为获取中的则不会进入,地图中的每一个节点是一个模块记录,上面有导出变量的内存地址,导入时会做一个连接——即指向同一块内存。
- CJS 是动态的,运行时决定各模块的关系,可以动态加载。本质上导出的 `module.exports` 属性,是值的拷贝。CJS 会对进行缓存,`require` 时会检查是否存在缓存,借助`「模块缓存」`来解决循环依赖的问题,每次加载到已经执行了的部分,再次加载时读取的是缓存,如果此时数据被改动,缓存中的数据也会改动。
- ESM 是静态的,编译时处理好各模块关系,不能动态加载。本质上输出的值的引用,可以混合导出。可以进行 tree-shaking。借助`「模块地图」`来解决循环依赖的问题,已经进入过的模块标注为获取中(pending),遇到 import 语句会去检查这个地图,已经标注为获取中的则不会进入,地图中的每一个节点是一个模块记录,上面有导出变量的内存地址,导入时会做一个连接——即指向同一块内存。

## node 中使用 ESM

Expand Down

0 comments on commit 4630214

Please sign in to comment.