Linux 下使用 MySQL

卸载 MySQL

1、检查 mysql service

systemctl status mysqld.service

2、关闭 mysql 服务

systemctl stop mysqld.service

3、查看当前 mysql 安装状况

(1)方式一

rpm -qa | grep -i mysql

(2)方式二

yum list installed | grep mysql

4、卸载上述命令查询出的已安装程序

#MySQL有多个程序
yum remove mysql-xxx mysql-xxx mysql-xxx mysql-xxx

5、多次执行 rpm -qa | grep -i mysql 确认是否有卸载残留

6、删除 mysql 相关文件

(1)查找相关文件

find / -name mysql

(2)删除上述命令查找出的相关文件

rm -rf xxx

7、删除 my.cnf

rm -rf /etc/my.cnf

 

安装 Linux 版本 MySQL

1、安装方式

(1)rpm 命令:安装扩展名为 .rpm 的软件包

(2)yum命令:需联网,从 互联网获取 的yum源,直接使用yum命令安装

(3)编译安装源码包:针对 tar.gz 这样的压缩格式,使用 tar 命令解压;如果是其它压缩格式,则使用其它命令

安装方式 特点
rpm 安装简单,灵活性差,无法灵活选择版本、升级
rpm repository 安装包极小,版本安装简单灵活,升级方便,需要联网安装
通用二进制包 安装比较复杂,灵活性高,平台通用性好
源码包 安装最复杂,时间长,参数设置灵活,性能好

2、RPM Bundle 全量包:包括所有组件

 

CentOS 7 检查 MySQL 依赖

1、检查 /tmp 临时目录权限(必须)

(1)由于 mysql 安装过程中,会通过 mysql 用户在 /tmp 目录下新建 tmp_db 文件,所以请给 /tmp较大的权限

chmod -R 777 /tmp

2、安装前,检查依赖

(1)检查 libaio 包

rpm -qa|grep libaio

(2)检查 net-tools 包

rpm -qa|grep net-tools

3、若不存在,需要到 CentOS 安装盘中进行 rpm 安装

4、若安装 Linux 时,带图形化界面,以上包已安装

 

 CentOS 7 下 MySQL 安装

1、将安装程序拷贝到 /opt 目录下

2、在 mysql 安装文件目录下执行(必须按照顺序执行)

rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm

(1)注意:若在检查工作时,没有检查 mysql 依赖环境,在安装 mysql-community-server 时会报错

(2)rpm:Redhat Package Manage,通过 RPM 管理,用户可以把源代码包装成以 rpm 为扩展名的文件形式,易于安装

(3)-i、--install:安装软件包

(4)-v、--verbose:提供更多的详细信息输出

(5)-h、--hash:软件包安装的时,列出哈希标记,展示进度条

3、可能产生的错误:mariadb-libs 被 mysql-community-libs-8.0.25-1.e7.×86_64 取代

(1)清除之前安装过的依赖即可

yum remove mysql-libs

4、查看 MySQL 版本

(1)执行如下命令,若成功,表示成功安装 mysql

mysql --version
#或
mysqladmin --version

5、初始化服务

(1)为了保证数据库目录,与文件的所有者为 mysql 登录用户,若以 root 身份运行 mysql 服务,需要执行下面的命令初始化

mysqld --initialize --user=mysql

(2)--initialize 选项默认以安全模式初始化,则会为 root 用户生成一个密码,并将该密码标记为过期,在日志中记录生成的临时密码,登录后需要设置一个新的密码

(3)查看密码,root@localhost: 后为初始化密码

cat /var/log/mysqld.log

6、启动MySQL,查看状态

(1)允许省略 .service 后缀

(2)启动

systemctl start mysqld.service

(3)关闭

systemctl stop mysqld.service

(4)重启

systemctl restart mysqld.service

(5)查看状态

systemctl status mysqld.service

(6)mysqld 可执行文件,代表 MySQL 服务器程序,运行 mysql 可以直接启动一个服务器进程

7、查看进程

ps -ef | grep -i mysql

8、查看 MySQL 服务是否自启动

systemctl list-unit-files | grep mysqld.service

(1)默认为 enabled

(2)设置自启动

systemctl enable mysqld.service

(3)设置手动启动

systemctl disable mysqld.service

 

登录 MySQL

1、首次登录

mysql -hlocalhost -P3306 -uroot -p

(1)在 Enter password: 录入初始化密码

2、修改密码

(1)因为初始化密码默认是过期的,所以查看数据库会报错

(2)修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

(3)5.7 版本之后(不含 5.7),mysql 加入全新密码安全机制,设置新密码太简单会报错

 

设置远程登录

1、Mysql 配置不支持远程连接引起错误

2、确认网络

(1)保证网络畅通:在远程机器上使用 ping ip地址

(2)保证端口号开放访问:在远程机器上使用 telnet 命令

(3)开启 telnet 命令:控制面板 -> 程序和功能 -> 启用或关闭 Windows 功能 -> Telnet 客户端

3、关闭防火墙或开放端口

(1)方式一:关闭防火墙(不使用)

#CentOS 7
#开启防火墙
systemctl start firewalld.service
#查询防火墙状态
systemctl status firewalld.service
#关闭防火墙
systemctl stop firewalld.service
#设置开机启用防火墙
systemctl enable firewalld.service
#设置开机禁用防火墙
systemctl disable firewalld.service

(2)方式二:开放端口

#查看开放的端口号
firewall-cmd --list-all
#永久开放http服务
firewall-cmd --add-service=http --permanent
#设置开放的端口号
firewall-cmd --add-port=端口号/tcp --permanent
#重启防火墙
firewall-cmd --reload

4、查看用户的当前主机配置信息

USE mysql;
SELECT Host,User FROM user;

5、修改 Host 为通配符 %,Host 设置 % 后,便可以允许远程访问

UPDATE user SET Host = '%' WHERE user ='用户名';

(1)Host 列指定允许用户登录所使用的 IP

(2)localhost:表示只能通过本机客户端去访问

(3)%:通配符 ,若 Host=192.168.1.%,表示只要是 IP 地址前缀为 192.168.1. 的客户端都可以连接;若 Host=% ,表示所有 IP 都有连接权限

(4)注意:在生产环境下,将 Host 设置为 % 产生安全问题,具体根据生产环境 IP 进行设置

(5)Host 修改完成后,使配置立即生效

flush privileges;

6、图形界面工具连接 MySQL 8 时,可能出现错误:Authentication plugin 'caching_sha2_password' cannot be loaded

(1)原因:MySQL 8 之前的版本中,加密规则:mysql_native_password,在 MySQL 8 之后,加密规则:caching_sha2_password

(2)方式一:升级图形界面工具版本

(2)方式二:把 MySQL 8 用户登录密码加密规则,还原为 mysql_native_password

#使用mysql数据库
USE mysql;
#修改'root'@'localhost'用户的密码规则和密码
ALTER USER '用户名'@'可连接IP地址' IDENTIFIED WITH mysql_native_password BY '用户的新密码';
#刷新权限
FLUSH PRIVILEGES;

 

密码强度评估

1、在 MySQL 8.0 之前,MySQL 使用 validate_password 插件检测、验证账号密码强度,保障账号的安全性

2、安装 / 启用插件方式一:在参数文件 my.cnf 中添加参数

[mysqld]
plugin-load-add=validate_password.so
\#ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 是否使用该插件(及强制/永久强制使用)
validate-password=FORCE_PLUS_PERMANENT

(1)plugin library 中的 validate_password 文件名的后缀名,根据平台不同有所差异

(2)对于 Unix 和 Unix-like 系统而言,文件后缀名是 .so

(3)对于 Windows 系统而言,文件后缀名是 .dll

(4)修改参数后,必须重启 MySQL 服务才能生效

(5)参数 FORCE_PLUS_PERMANENT,防止插件在 MySQL 运行时被卸载

3、安装 / 启用插件方式二:运行时命令安装(建议)

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

(1)此方法也会注册到元数据,即 mysql.plugin 表中,所以 MySQL 重启后插件不会失效

4、卸载插件、组件

(1)卸载插件

UNINSTALL PLUGIN validate_password;

(2)卸载组件

UNINSTALL COMPONENT 'file://component_validate_password';

 

MySQL 8  之前的安全策略

1、使用 validate_password 插件检测、验证账号密码强度,保障账号的安全性

2、安装 / 启用插件方式一:在参数文件 my.cnf 中添加参数

[mysqld]
plugin-load-add=validate_password.so
#ON(开启)/OFF(关闭)/FORCE(强制使用)/FORCE_PLUS_PERMANENT(永久强制使用)
validate-password=FORCE_PLUS_PERMANENT

(1)plugin library 中的 validate_password 文件后缀名根据平台不同有所差异,对于 Unix、Unix-like 系统,文件后缀名为 .so,对于 Windows 系统,文件后缀名为 .dll

(2)修改参数后,必须重启 MySQL 服务才能生效

(3)参数 FORCE_PLUS_PERMANENT 是为了防止插件在 MySQL 运行时被卸载,当卸载插件时就会报错

UNINSTALL PLUGIN validate_password;
ERROR 1702 (HY000): Plugin 'validate_password' is force_plus_permanent and can not be unloaded

3、安装 / 启用插件方式二:运行时命令安装(建议)

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

(1)此方法同时注册到元数据,即 mysql.plugin 表中

(2)MySQL 重启后,插件不会失效

 

MySQL 8 安全策略

1、validate_password

(1)MySQL 8.0,引入特性:服务器组件,validate_password 插件已用服务器组件重新实现

(2)8.0.25 版本的数据库中,默认自动安装 validate_password 组件

(3)validate_password 组件对应的系统变量

选项 默认值 参数描述
validate_password_check_user_name ON 设置为 ON 时,表示能将密码设置成当前用户名
validate_password_dictionary_file   用于检查密码的字典文件的路径名,默认为空
validate_password_length 8 密码的最小长度,即密码长度必须大于等于 8
validate_password_mixed_case_count 1 如果密码策略是中等或更强,validate_password 要求密码具有的小写和大写字符的最小数量
validate_password_number_count 1 密码必须包含的数字个数
validate_password_policy MEDIUM 密码强度检验等级,可以使用数值 0、1、2 或相应的符号值 LOW、MEDIUM、STRONG 来指定,0 / LOW:只检查长度,1 / MEDIUM:检查长度、数字、大小写、特殊字符,2 / STRONG:检查长度、数字、大小写、特殊字符、字典文件
validate_password_special_char_count 1 密码必须包含的特殊字符个数

(4)组件和插件的默认值可能有所不同,MySQL 5.7 validate_password_check_user_name 默认值为 OFF

2、修改安全策略

(1)修改密码验证安全强度

SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_policy=MEDIUM;
SET GLOBAL validate_password_policy=STRONG;
#For LOW
SET GLOBAL validate_password_policy=0;
#For MEDIUM
SET GLOBAL validate_password_policy=1;
#For HIGH
SET GLOBAL validate_password_policy=2;
#注意,若为插件,SQLset global validate_password_policy=LOW

(2)修改密码中字符的长度

SET GLOBAL validate_password_length=1;

(3)其余略

3、测试密码强度

SELECT VALIDATE_PASSWORD_STRENGTH('被测试密码');

(1)如果没有安装 validate_password 组件或插件的话,则函数永远都返回 0

(2)密码复杂度对应的密码复杂度策略

密码测试 返回值
Length < 4 0
Length ≥ 4 and < validate_password.length 25
Satisfies policy 1 (LOW) 50
Satisfies policy 2 (MEDIUM) 75
Satisfies policy 3 (STRONG) 100

(3)当评估在 100 时,说明使用上最基本的规则:大写 + 小写 + 特殊字符 + 数字组成 8 位以上密码

 

MySQL 5.7 修改字符集

1、在 MySQL 8.0 版本之前,默认字符集为 latin1 ,utf8 字符集指向 utf8mb3

2、从 MySQL 8.0 开始,数据库默认编码为 utf8mb4,避免乱码问题

3、查看默认使用的字符集

show variables like 'character%';
#或
show variables like '%char%';

4、修改字符集

vim /etc/my.cnf

(1)在 MySQL 5.7 或之前的版本中,在文件最后加上中文字符集配置

character_set_server=utf8

5、重新启动 MySQL 服务

systemctl restart mysqld

(1)原库、原表设定不会发生变化,参数修改只对新建的数据库生效

6、修改已有库、表字符集

(1)修改已创建数据库的字符集

alter database 数据库名 character set 'utf8';

(2)修改已创建数据表的字符集

alter table 表名 convert to character set 'utf8';

(3)原有数据若使用非 utf8 编码,数据本身编码不会发生改变,已有数据需要导出或删除,然后重新插入

 

各级别的字符集

1、MySQL 4 个级别的字符集和比较规则

(1)服务器级别

(2)数据库级别

(3)表级别

(4)列级别

2、查看默认字符集

show variables like 'character%';

(1)character_set_server:服务器级别的字符集

(2)character_set_database:当前数据库的字符集

(3)character_set_client:服务器解码请求时,使用的字符集

(4)character_set_connection:服务器处理请求时,把请求字符串从 character_set_client 转为 character_set_connection

(5)character_set_results:服务器向客户端返回数据时,使用的字符集

3、服务器级别

(1)character_set_server:服务器级别的字符集

(2)可以在启动服务器程序时,通过启动选项,或在服务器程序运行过程中,使用 SET 语句修改以下两个变量的值

[server]
#默认字符集
character_set_server=gbk
#对应的默认的比较规则
collation_server=gbk_chinese_ci

(3)查看服务器的字符集和比较规则

SHOW VARIABLES LIKE '%_server';

4、数据库级别

(1)character_set_database:当前数据库的字符集

(2)创建和修改数据库的时,可以指定该数据库的字符集和比较规则

CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];

(3)若创建数据库时,没有显式的指定字符集和比较规则,则使用该数据库默认用服务器的字符集和比较规则

(4)查看数据库的字符集和比较规则

SHOW VARIABLES LIKE '%_database';

(5)查看具体数据库的字符集

SHOW CREATE DATABASE 数据库名;

5、表级别

(1)可以在创建和修改表的时,指定表的字符集和比较规则

CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]];
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称];

(2)若创建和修改表的语句中,没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则,作为该表的字符集和比较规则

(3)查看表的字符集

SHOW CREATE TABLE 表名;

6、列级别

(1)对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则

(2)在创建和修改列定义时,可以指定该列的字符集和比较规则

CREATE TABLE 表名(
    列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
    其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

(3)对于某个列,若在创建和修改的语句中,没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则,作为该列的字符集和比较规则

(4)在转换列的字符集时注意,若转换后的字符集不能兼容,转换前列中存储数据,则报错

 

字符集与比较规则

1、utf8、utf8mb4

(1)utf8 字符集表示一个字符需要使用 1 ~ 4 个字节,

(2)utf8mb3:即 MySQL 中的 utf8,只使用 1 ~ 3 个字节表示字符

(3)utf8mb4:使用 1 ~ 4 个字节表示字符

2、比较规则

后缀 英文释义 描述
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitive 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制方式比较

3、查看表的比较规则

SHOW CREATE TABLE 表名;

 

请求到响应过程中字符集的变化

系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器处理请求时会把请求字符串从 character_set_client 转为 character_set_connection
character_set_results 服务器向客户端返回数据时使用的字符集

1、客户端发送请求,使用操作系统字符集编码请求字符串

(1)一般情况下,客户端所使用的字符集和当前操作系统一致

(2)类 UNIX 系统:LC_ALL > LC_CTYPE > LANG,优先级依次递减,3 个环境变量决定操作系统当前使用的字符集

(3)Windows 系统:还与客户端启动时设置的 default-character-set 启动选项有关,这一点不适用于类 UNIX 系统

(4)如果使用可视化工具,可能会使用自定义的字符集来编码发送到服务器的字符串,而不采用操作系统默认的字符集

2、从 character_set_client 转换为 character_set_connection:服务器接收到客户端发送来的请求其实是一串二进制的字节,它会认为这串字节采用的字符集是 character_set_client ,然后把这串字节转换为 character_set_connection 字符集编码的字符

3、从 character_set_connection 转换为具体列使用的字符集:若某个列使用的字符集,和 character_set_connection 代表的字符集不一致,还需要进行一次字符集转换,因为列的字符集和排列规则的优先级更高

4、将查询结果从具体列使用的字符集,转换为 character_set_results

5、不同操作系统的客户端收到响应

(1)类 UNIX 操作系统:如果没有特殊设置,一般使用操作系统当前使用的字符集,解码响应字节序列

(2)Windows 操作系统:使用客户端的默认字符集来解释字节序列

 

SQL 大小写规范

1、在 SQL 中,关键字和函数名是不用区分字母大小写的

2、但需要确定大小写的规范,在 Linux 和 Windows 环境下,Windows 默认大小写不敏感,Linux 大小写敏感

3、查看规范

SHOW VARIABLES LIKE '%lower_case_table_names%';

(1)默认为 0,大小写敏感

(2)设置 1,大小写不敏感,创建的表,数据库都是以小写形式存放在磁盘上,对于 SQL 语句都是转换为小写对表和数据库进行查找

(3)设置 2,创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行

4、MySQL 在 Linux 下数据库名、表名、列名、别名大小写规则

(1)数据库名、表名、表的别名、变量名是严格区分大小写

(2)关键字、函数名称在 SQL 中不区分大小写

(3)列名(字段名)与列的别名(字段别名)在所有的情况下均是忽略大小写

5、MySQL 在 Windows 环境下全部不区分大小写 

 

Linux 下大小写规则设置

1、当想设置为大小写不敏感时,在 my.cnf 配置文件 [mysqld] 中加入 lower_case_table_names=1 ,然后重启服务器

(1)在重启数据库实例之前,需要将原来的数据库和表转换为小写,否则将找不到数据库名

(2)此参数适用 MySQL 5.7,在 MySQL 8 下禁止在重新启动 MySQL 服务时,将 lower_case_table_names 设置成不同于初始化 MySQL 服务时设置的 lower_case_table_names 值

2、MySQL 8 设置为大小写不敏感

(1)停止 MySQL 服务

(2)删除数据目录,即删除 /var/lib/mysql 目录

(3)在 MySQL 配置文件 /etc/my.cnf 中添加 lower_case_table_names=1

(4)启动MySQL服务

 

SQL 命名规范

1、变量名命名规范没有统一,可能产生错误

2、建议

(1)关键字和函数名称全部大写,因为数据库名、表名和字段名在 Linux MySQL 环境下是区分大小写的

(2)数据库名、表名、表别名、字段名、字段别名等全部小写,以便于区分数据库名、表名、字段名

(3)SQL 语句必须以分号结尾

 

sql_mode 合理设置

1、概述

(1)sql_mode 影响 MysQL 支持的 SQL 语法,以及它执行的数据验证检查,通过设置 sql_mode,可以完成不同严格程度的数据校验,有效地保障数据准确性

(2)MySQL 服务器可以在不同 SQL 模式下运行,并且可以针对不同的客户端,以不同的方式应用这些模式,具体取决于 sql_mode 系统变量的值

2、版本默认参数

(1)MySQL 5.6 默认值为空,即 NO_ENGINE_SUBSTITUTION,表示一个空值,没有模式设置,可以理解为宽松模式,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入

(2)MySQL 5.7 默认值为 STRICT_TRANS_TABLES,即严格模式,用于进行数据的严格校验,错误数据不能插入,报 error,并且事务回滚

3、宽松模式

(1)在插入一个错误的数据时,也可能会被接受,并且不报错

(2)应用场景 :保证大多数 SQL 符合标准的 SQL 语法,这样应用在不同数据库之间进行迁 时,则不需要对业务 SQL 进行较大的修改

4、严格模式

(1)在插入一个错误的数据时,则报错

(2)MySQL 5.7 版本就将 sql_mode 默认值改为了严格模式

(3)开发、测试、生产等环境中,必须采用的是严格模式

5、查看当前 sql_mode

#当前会话
SELECT @@session.sql_mode
#全局
SELECT @@global.sql_mode
#或
SHOW variables LIKE 'sql_mode';

6、临时设置方式:设置当前窗口中设置 sql_mode

(1)只在当前会话中生效,关闭当前会话就不生效

SET SESSION sql_mode = 'modes...';

(2)只在当前服务中生效,重启 MySQL 服务后失效

SET GLOBAL sql_mode = 'modes...';

7、永久设置方式:在 /etc/my.cnf 中配置 sql_mode

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

(1)设置后重启 MySQL

(2)生产环境上是禁止重启 MySQL 服务的,所以采用:临时设置方式 + 永久设置方式,解决线上的问题

8、常用值

描述
ONLY_FULL_GROUP_BY 对于 GROUP BY 聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现,则该 SQL 不合法,因为列不在 GROUP BY 从句中
NO_AUTO_VALUE_ON_ZERO 该值影响自增长列的插入,默认设置下,插入 0 或 NULL 代表生成下一个自增长值,如果用户希望插入的值为 0,而该列又是自增长的,则该选项生效
STRICT_TRANS_TABLES 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE
在严格模式下,不允许日期和月份为零
NO_ZERO_DATE
设置该值,mysq 数据库不允许插入零日期,插入零日期会抛出错误,而不是 NO_ZERO_DATE 警告
ERROR_FOR_DIVISION_BY_ZERO
在 INSERT 或 UPDATE 过程中,如果数据被零除,则产生错误而非警告,如果未给出该模式,则数据被零除时,MySQL 返回NULL
NO_AUTO_CREATE_USER
禁止 GRANT 创建密码为空的用户
NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,则抛出错误,不设置此值时,用 NO_ENGINE_SUBSTITUTION 默认的存储引擎替代,并抛出一个异常
PIPES_AS_CONCAT
将 || 视为字符串的连接操作符,而非或运算符,这和 Oracle 数据库是一样的,和字符串的拼接函数 Concat 相类似
ANSI_QUOTES
启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符
posted @   半条咸鱼  阅读(132)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示