一、字符集

1. 默认设置

  • MYSQL 5.7默认字符集为latin, MYSQL 8.0默认为utf8mb4
  • utf8(utf8mb3): 阉割过的utf8字符集,使用1-3个字节表示字符
  • utfmb4: 正宗的utf8字符集,使用1-4个字节表示字符(比如emoji表情)
-- 1. 查看
SHOW VARIABLES LIKE 'character%';

character_set_client,utf8mb4         # 客户端发送请求时候用的数据编码
character_set_connection,utf8mb4
character_set_database,utf8mb4       # 对应的database
character_set_filesystem,binary
character_set_results,utf8mb3
character_set_server,utf8mb4         # 对应的server
character_set_system,utf8mb3
character_sets_dir,/usr/share/mysql-8.0/charsets/

2. 依赖

# mysql包含四个级别的字符集和比较规则
# 不指定就会默认高等级的
# 也可显示的指定,一般不会显示的指定
- 服务器级别
- 数据库级别
- 表级别
- 列级别

3. 比较规则

  • 每个字符集具有依赖的默认比较规则
Charset   DESC              DEFAULT collation     Max length
utf8      UTF-8 Unicode     utf8_general_ci       3
utf8mb4   UTF-8 Unicode     utf8mb4_0900_ai_ci     4

SHOW CHARACTER SET;
SHOW COLLATION;

mysql 字段默认值空字符串 mysql5.7默认字符集_服务器

4. Linux大小写规范

  • 库,表,表别名,变量名(结构名称)区分大小写
  • 关键字,函数名称在sql中不区分大小写
  • 列名,列别名不区分大小写

二、目录结构

  • 基于Docker

1. 目录结构

# 该目录下保存对应的db, 比如自定义的库,系统库
/var/lib/mysql/  
SHOW VARIABLES LIKE '%datadir%'; # 环境变量,对应着这个保存的目录

# 指定的数据库: 
# 表数据: employee.ibd  erick.ibd  erick_shu.ibd	nike_shoe.ibd
/var/lib/mysql/shuzhan_db

# 存放mysql的对应的一些指令
/usr/bin

# mysql 配置文件
/etc/mysql/my.cnf

2. 系统库

1. mysql库
- 目录结构:/var/lib/mysql/mysql
-  MYSQL系统自带的核心数据库
- 存储了MYSQL的用户账户和权限信息,一些存储过程,
- 事件的自定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息

2. information_schema库
- MYSQL系统自带的数据库
- 保存mysql服务器 维护的所有其他数据库的信息
- 有哪些表,视图,触发器,列,索引
- 并不是真实用户数据,而是一些描述信息,也称为 元数据

3. performance_schema库
- MYSQL系统自带的数据库
- 保存服务器运行过程中的一些状态信息
- 用来监控MYSQL服务的各类性能指标: 最近执行了哪些语句,执行阶段花费时间,内存使用情况等

4 sys库
- MYSQL系统自带的数据库
- 通过视图的形式把information_schema和performance_schema结合,监控mysql的技术性能

3. 文件结构

3.1 表空间-InnoDB

  • 独立表空间,表数据会合并到 .idb文件中,方便管理
  • /var/lib/mysql/erick_db (employee.ibd student.ibd)
  • Oracle官方将 .frm 文件(表结构)的信息及更多信息移动到序列化字典信息(Serialized Directory Information, SDI), SDI被写在ibd文件内部
# .ibd解析文件, Oracle提供了一个应用程序叫 ibd2dsi
ibd2sdi --dump-file=employee.txt employee.ibd      #文件解析为txt

mysql 字段默认值空字符串 mysql5.7默认字符集_mysql_02

3.2 表空间-MyISAM

people.MYD	     # 存放数据
people.MYI       # 存放索引
people_416.sdi   # 表结构空间

三、权限管理

1. 用户管理

  • 一个Server端可以包含多个用户,每个用户之间互不影响
  • root用户权限最大,可以创建不同的用户
  • 账户信息保存在mysql的 mysql库----user表中,密码采用掩码的方式保存
# 1. 默认用户: SELECT * FROM mysql.user;
%             root
localhost     mysql.infoschema
localhost     mysql.session
localhost     mysql.sys
localhost     root

# 2. 向user表中添加新的用户名及账户, 密码自动会转换为掩码
# 表主键: 会采用 host+user两个字段作为主键
CREATE USER 'shuzhan'@'%' IDENTIFIED BY '888888';
CREATE USER 'lucy'@'localhost' IDENTIFIED BY '123456';

#3. 删除用户
DROP USER 'lucy'@'localhost';
Host字段:                    访问权限
                            %:代表远程可以访问,localhost只能本地在本地访问数据库
User字段:                   用户名   
authentication_string字段:  密码

2.修改密码

  • 不能直接修改authentication_string, 否则保存的密码就是明文
  • 通过下面方式修改的,密码会加密保存,才可以正确访问
  • 重启Server端,密码生效
# 1. 修改当前登陆用户的密码
ALTER USER USER() IDENTIFIED BY '111111';
SET PASSWORD = 'abcabc';

# 2. 修改其他用户的密码
ALTER USER  'shuzhan'@'%' IDENTIFIED BY '111111';
SET PASSWORD FOR 'shuzhan'@'%'='hello123';

3. 用户授权

  • root 用户下面的表: information_schema、mysql 、performance_schema、sys
  • create新增账户的表: information_schema
  • 因此要将root权限的的部分表授权给新用户
- 最小权限管理
- 限制指定ip或者主机登陆
- 为每个用户设置满足密码复杂度的设置
- 定期清理不需要的用户和权限
# 查看权限
SHOW PRIVILEGES ;

# 1.  以root身份登录数据库
mysql -u root -p

# 2. 将root权限下所有数据库下所有表所有权限  都授权给shuzhan用户
GRANT ALL PRIVILEGES on *.* to 'shuzhan'@'%';

# 3. 将某个库的所有表的所有权限授权给shuzhan用户,gulimall_order.* 
GRANT ALL PRIVILEGES gulimall_order.* to 'shuzhan'@'%';

# 4. 某个数据库的表的部分权限
# 多次赋权,是去增加权限,不是覆盖
GRANT select,delete,update,create,drop on gulimall_order.* 'shuzhan'@'%';

# 5. 删除权限
REVOKE select ON *.* FROM 'shuzhan'@'%' ;

# 6 底层实现: 通过一系列表来实现
mysql.user   mysql.db  mysql.tables_priv