mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-10 00:41:37 +08:00
Compare commits
9 Commits
b04ff06aa8
...
adff2d8772
Author | SHA1 | Date | |
---|---|---|---|
|
adff2d8772 | ||
|
e35101ac05 | ||
|
0500cd6baa | ||
|
ae952aec83 | ||
|
331082d8f6 | ||
|
548b002fbf | ||
|
5c01ecdff8 | ||
|
0bd54aa950 | ||
|
a5628f4127 |
@ -34,7 +34,7 @@ ER 图由下面 3 个要素组成:
|
||||
|
||||
- **实体**:通常是现实世界的业务对象,当然使用一些逻辑对象也可以。比如对于一个校园管理系统,会涉及学生、教师、课程、班级等等实体。在 ER 图中,实体使用矩形框表示。
|
||||
- **属性**:即某个实体拥有的属性,属性用来描述组成实体的要素,对于产品设计来说可以理解为字段。在 ER 图中,属性使用椭圆形表示。
|
||||
- **联系**:即实体与实体之间的关系,这个关系不仅有业务关联关系,还能通过数字表示实体之间的数量对照关系。例如,一个班级会有多个学生就是一种实体间的联系。
|
||||
- **联系**:即实体与实体之间的关系,在 ER 图中用菱形表示,这个关系不仅有业务关联关系,还能通过数字表示实体之间的数量对照关系。例如,一个班级会有多个学生就是一种实体间的联系。
|
||||
|
||||
下图是一个学生选课的 ER 图,每个学生可以选若干门课程,同一门课程也可以被若干人选择,所以它们之间的关系是多对多(M: N)。另外,还有其他两种实体之间的关系是:1 对 1(1:1)、1 对多(1: N)。
|
||||
|
||||
@ -130,7 +130,7 @@ ER 图由下面 3 个要素组成:
|
||||
|
||||
### 执行速度不同
|
||||
|
||||
一般来说:`drop` > `truncate` > `delete`(这个我没有设计测试过)。
|
||||
一般来说:`drop` > `truncate` > `delete`(这个我没有实际测试过)。
|
||||
|
||||
- `delete`命令执行的时候会产生数据库的`binlog`日志,而日志记录是需要消耗时间的,但是也有个好处方便数据回滚恢复。
|
||||
- `truncate`命令执行的时候不会产生数据库日志,因此比`delete`要快。除此之外,还会把表的自增值重置和索引恢复到初始大小等。
|
||||
|
@ -94,7 +94,7 @@ UTF-8 可以根据不同的符号自动选择编码的长短,像英文字符
|
||||
|
||||
UTF-32 的规则最简单,不过缺陷也比较明显,对于英文字母这类字符消耗的空间是 UTF-8 的 4 倍之多。
|
||||
|
||||
**UTF-8** 是目前使用最广的一种字符编码,。
|
||||
**UTF-8** 是目前使用最广的一种字符编码。
|
||||
|
||||

|
||||
|
||||
@ -102,10 +102,173 @@ UTF-32 的规则最简单,不过缺陷也比较明显,对于英文字母这
|
||||
|
||||
MySQL 支持很多种字符编码的方式,比如 UTF-8、GB2312、GBK、BIG5。
|
||||
|
||||
你可以通过 `SHOW CHARSET` 命令来查看。
|
||||
### 查看支持的字符集
|
||||
|
||||
你可以通过 `SHOW CHARSET` 命令来查看,支持 like 和 where 子句。
|
||||
|
||||

|
||||
|
||||
### 默认字符集
|
||||
|
||||
在 MySQL5.7 中,默认字符集是 `latin1` ;在 MySQL8.0 中,默认字符集是 `utf8mb4`
|
||||
|
||||
### 字符集的层次级别
|
||||
|
||||
MySQL 中的字符集有以下的层次级别:
|
||||
|
||||
- `server`(MySQL 实例级别)
|
||||
- `database`(库级别)
|
||||
- `table`(表级别)
|
||||
- `column`(字段级别)
|
||||
|
||||
它们的优先级可以简单的认为是从上往下依次增大,也即 `column` 的优先级会大于 `table` 等其余层次的。如指定 MySQL 实例级别字符集是`utf8mb4`,指定某个表字符集是`latin1`,那么这个表的所有字段如果不指定的话,编码就是`latin1`。
|
||||
|
||||
#### server
|
||||
|
||||
不同版本的 MySQL 其 `server` 级别的字符集默认值不同,在 MySQL5.7 中,其默认值是 `latin1` ;在 MySQL8.0 中,其默认值是 `utf8mb4` 。
|
||||
|
||||
当然也可以通过在启动 `mysqld` 时指定 `--character-set-server` 来设置 `server` 级别的字符集。
|
||||
|
||||
```bash
|
||||
mysqld
|
||||
mysqld --character-set-server=utf8mb4
|
||||
mysqld --character-set-server=utf8mb4 \
|
||||
--collation-server=utf8mb4_0900_ai_ci
|
||||
```
|
||||
|
||||
或者如果你是通过源码构建的方式启动的 MySQL,你可以在 `cmake` 命令中指定选项:
|
||||
|
||||
```sh
|
||||
cmake . -DDEFAULT_CHARSET=latin1
|
||||
或者
|
||||
cmake . -DDEFAULT_CHARSET=latin1 \
|
||||
-DDEFAULT_COLLATION=latin1_german1_ci
|
||||
```
|
||||
|
||||
此外,你也可以在运行时改变 `character_set_server` 的值,从而达到修改 `server` 级别的字符集的目的。
|
||||
|
||||
`server` 级别的字符集是 MySQL 服务器的全局设置,它不仅会作为创建或修改数据库时的默认字符集(如果没有指定其他字符集),还会影响到客户端和服务器之间的连接字符集,具体可以查看 [MySQL Connector/J 8.0 - 6.7 Using Character Sets and Unicode](https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html)。
|
||||
|
||||
#### database
|
||||
|
||||
`database` 级别的字符集是我们在创建数据库和修改数据库时指定的:
|
||||
|
||||
```sql
|
||||
CREATE DATABASE db_name
|
||||
[[DEFAULT] CHARACTER SET charset_name]
|
||||
[[DEFAULT] COLLATE collation_name]
|
||||
|
||||
ALTER DATABASE db_name
|
||||
[[DEFAULT] CHARACTER SET charset_name]
|
||||
[[DEFAULT] COLLATE collation_name]
|
||||
```
|
||||
|
||||
如前面所说,如果在执行上述语句时未指定字符集,那么 MySQL 将会使用 `server` 级别的字符集。
|
||||
|
||||
可以通过下面的方式查看某个数据库的字符集:
|
||||
|
||||
```sql
|
||||
USE db_name;
|
||||
SELECT @@character_set_database, @@collation_database;
|
||||
```
|
||||
|
||||
```sql
|
||||
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
|
||||
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';
|
||||
```
|
||||
|
||||
#### table
|
||||
|
||||
`table` 级别的字符集是在创建表和修改表时指定的:
|
||||
|
||||
```sql
|
||||
CREATE TABLE tbl_name (column_list)
|
||||
[[DEFAULT] CHARACTER SET charset_name]
|
||||
[COLLATE collation_name]]
|
||||
|
||||
ALTER TABLE tbl_name
|
||||
[[DEFAULT] CHARACTER SET charset_name]
|
||||
[COLLATE collation_name]
|
||||
```
|
||||
|
||||
如果在创建表和修改表时未指定字符集,那么将会使用 `database` 级别的字符集。
|
||||
|
||||
#### column
|
||||
|
||||
`column` 级别的字符集同样是在创建表和修改表时指定的,只不过它是定义在列中。下面是个例子:
|
||||
|
||||
```sql
|
||||
CREATE TABLE t1
|
||||
(
|
||||
col1 VARCHAR(5)
|
||||
CHARACTER SET latin1
|
||||
COLLATE latin1_german1_ci
|
||||
);
|
||||
```
|
||||
|
||||
如果未指定列级别的字符集,那么将会使用表级别的字符集。
|
||||
|
||||
### 连接字符集
|
||||
|
||||
前面说到了字符集的层次级别,它们是和存储相关的。而连接字符集涉及的是和 MySQL 服务器的通信。
|
||||
|
||||
连接字符集与下面这几个变量息息相关:
|
||||
|
||||
- `character_set_client` :描述了客户端发送给服务器的 SQL 语句使用的是什么字符集。
|
||||
- `character_set_connection` :描述了服务器接收到 SQL 语句时使用什么字符集进行翻译。
|
||||
- `character_set_results` :描述了服务器返回给客户端的结果使用的是什么字符集。
|
||||
|
||||
它们的值可以通过下面的 SQL 语句查询:
|
||||
|
||||
```sql
|
||||
SELECT * FROM performance_schema.session_variables
|
||||
WHERE VARIABLE_NAME IN (
|
||||
'character_set_client', 'character_set_connection',
|
||||
'character_set_results', 'collation_connection'
|
||||
) ORDER BY VARIABLE_NAME;
|
||||
```
|
||||
|
||||
```sql
|
||||
SHOW SESSION VARIABLES LIKE 'character\_set\_%';
|
||||
```
|
||||
|
||||
如果要想修改前面提到的几个变量的值,有以下方式:
|
||||
|
||||
1、修改配置文件
|
||||
|
||||
```properties
|
||||
[mysql]
|
||||
# 只针对MySQL客户端程序
|
||||
default-character-set=utf8mb4
|
||||
```
|
||||
|
||||
2、使用 SQL 语句
|
||||
|
||||
```sql
|
||||
set names utf8mb4
|
||||
# 或者一个个进行修改
|
||||
# SET character_set_client = utf8mb4;
|
||||
# SET character_set_results = utf8mb4;
|
||||
# SET collation_connection = utf8mb4;
|
||||
```
|
||||
|
||||
### jdbc 对连接字符集的影响
|
||||
|
||||
不知道你们有没有碰到过存储 emoji 表情正常,但是使用类似 Navicat 之类的软件的进行查询的时候,发现 emoji 表情变成了问号的情况。这个问题很有可能就是 jdbc 驱动引起的。
|
||||
|
||||
根据前面的内容,我们知道连接字符集也是会影响我们存储的数据的,而 jdbc 驱动会影响连接字符集。
|
||||
|
||||
`mysql-connector-java` (jdbc 驱动)主要通过这几个属性影响连接字符集:
|
||||
|
||||
- `characterEncoding`
|
||||
- `characterSetResults`
|
||||
|
||||
以 `DataGrip 2023.1.2` 来说,在它配置数据源的高级对话框中,可以看到 `characterSetResults` 的默认值是 `utf8` ,在使用 `mysql-connector-java 8.0.25` 时,连接字符集最后会被设置成 `utf8mb3` 。那么这种情况下 emoji 表情就会被显示为问号,并且当前版本驱动还不支持把 `characterSetResults` 设置为 `utf8mb4` ,不过换成 `mysql-connector-java driver 8.0.29` 却是允许的。
|
||||
|
||||
具体可以看一下 StackOverflow 的 [DataGrip MySQL stores emojis correctly but displays them as?](https://stackoverflow.com/questions/54815419/datagrip-mysql-stores-emojis-correctly-but-displays-them-as)这个回答。
|
||||
|
||||
### UTF-8 使用
|
||||
|
||||
通常情况下,我们建议使用 UTF-8 作为默认的字符编码方式。
|
||||
|
||||
不过,这里有一个小坑。
|
||||
@ -127,10 +290,10 @@ MySQL 字符编码集中有两套 UTF-8 编码实现:
|
||||
|
||||
```sql
|
||||
CREATE TABLE `user` (
|
||||
`id` varchar(66) CHARACTER SET utf8mb4 NOT NULL,
|
||||
`name` varchar(33) CHARACTER SET utf8mb4 NOT NULL,
|
||||
`phone` varchar(33) CHARACTER SET utf8mb4 DEFAULT NULL,
|
||||
`password` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL
|
||||
`id` varchar(66) CHARACTER SET utf8mb3 NOT NULL,
|
||||
`name` varchar(33) CHARACTER SET utf8mb3 NOT NULL,
|
||||
`phone` varchar(33) CHARACTER SET utf8mb3 DEFAULT NULL,
|
||||
`password` varchar(100) CHARACTER SET utf8mb3 DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
```
|
||||
|
||||
@ -157,3 +320,6 @@ Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'name' at row 1
|
||||
- GB2312-维基百科:<https://zh.wikipedia.org/wiki/GB_2312>
|
||||
- UTF-8-维基百科:<https://zh.wikipedia.org/wiki/UTF-8>
|
||||
- GB18030-维基百科: <https://zh.wikipedia.org/wiki/GB_18030>
|
||||
- MySQL8 文档:<https://dev.mysql.com/doc/refman/8.0/en/charset.html>
|
||||
- MySQL5.7 文档:<https://dev.mysql.com/doc/refman/5.7/en/charset.html>
|
||||
- MySQL Connector/J 文档:<https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html>
|
||||
|
@ -210,7 +210,7 @@ JVM 具有四种类型的 GC 实现:
|
||||
- `-server` : 启用“ Server Hotspot VM”; 此参数默认用于 64 位 JVM
|
||||
- `-XX:+UseStringDeduplication` : _Java 8u20_ 引入了这个 JVM 参数,通过创建太多相同 String 的实例来减少不必要的内存使用; 这通过将重复 String 值减少为单个全局 `char []` 数组来优化堆内存。
|
||||
- `-XX:+UseLWPSynchronization`: 设置基于 LWP (轻量级进程)的同步策略,而不是基于线程的同步。
|
||||
- ``-XX:LargePageSizeInBytes `: 设置用于 Java 堆的较大页面大小; 它采用 GB/MB/KB 的参数; 页面大小越大,我们可以更好地利用虚拟内存硬件资源; 然而,这可能会导致 PermGen 的空间大小更大,这反过来又会迫使 Java 堆空间的大小减小。
|
||||
- `-XX:LargePageSizeInBytes`: 设置用于 Java 堆的较大页面大小; 它采用 GB/MB/KB 的参数; 页面大小越大,我们可以更好地利用虚拟内存硬件资源; 然而,这可能会导致 PermGen 的空间大小更大,这反过来又会迫使 Java 堆空间的大小减小。
|
||||
- `-XX:MaxHeapFreeRatio` : 设置 GC 后, 堆空闲的最大百分比,以避免收缩。
|
||||
- `-XX:SurvivorRatio` : eden/survivor 空间的比例, 例如`-XX:SurvivorRatio=6` 设置每个 survivor 和 eden 之间的比例为 1:6。
|
||||
- `-XX:+UseLargePages` : 如果系统支持,则使用大页面内存; 请注意,如果使用这个 JVM 参数,OpenJDK 7 可能会崩溃。
|
||||
|
@ -36,6 +36,8 @@ icon: project
|
||||
|
||||
## 考试/刷题系统
|
||||
|
||||
- [PlayEdu](https://github.com/PlayEdu/PlayEdu):一款适用于搭建内部培训平台的开源系统,旨在为企业/机构打造自己品牌的内部培训平台。
|
||||
- [HOJ](https://gitee.com/himitzh0730/hoj):分布式架构的在线测评平台 OJ 。
|
||||
- [uexam](https://gitee.com/mindskip/uexam):一个非常不错的考试系统!考试系统应用场景还挺多的,不论是对于在校大学生还是已经工作的小伙伴,并且,类似的私活也有很多。相关阅读:[《好一个 Spring Boot 开源在线考试系统!解决了我的燃眉之急》](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247491585%26idx%3D1%26sn%3D8d3c6768c22e72d6bfcbeee9624886a7%26chksm%3Dcea1afcaf9d626dc918760289c37025ad526f6255786bc198d2402203df64c873ad7934f58df%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd) 。
|
||||
- [PassJava-Platform](https://github.com/Jackson0714/PassJava-Platform):一个基于微服务(SpringBoot、Spring Cloud)的面试刷题系统!相关阅读:[《一个基于 Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽》](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247497045%26idx%3D1%26sn%3D577175bfd6c040a0df5a494fce6f9758%26chksm%3Dcea1ba9ef9d633883a2e213c0fb9a88bdc87051347d4b3fad2c2befb65d8b16e1ea81d8146dd%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd)。
|
||||
|
||||
|
@ -12,9 +12,9 @@
|
||||
|
||||
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||
|
||||
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](../about-the-author/zhishixingqiu-two-years.md)。
|
||||
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](../about-the-author/zhishixingqiu-two-years.md) 。
|
||||
|
||||
这里再送一个 **30** 元的星球专属优惠券吧,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
|
||||
这里再送一个 **30** 元的星球专属优惠券,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
|
||||
|
||||

|
||||
|
||||
|
@ -14,11 +14,7 @@
|
||||
|
||||
## 星球限时优惠
|
||||
|
||||
三年前,星球的定价是 **50/年** (星球规定的最低定价),我还附送了 33 元优惠券。扣除了星球手续费,发了各种福利之后,就是纯粹在做公益。感兴趣的小伙伴可以看看我在 **2020-01-03** 发的头条:[做了一个很久没敢做的事情](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486049&idx=1&sn=e0161b409e8f164251bdaa0c83a476bc&chksm=cea245aaf9d5ccbcafdb95a546d959508814085620aabdbb4385c4b8cea6e50bf157c3697041&token=1614894361&lang=zh_CN#rd),考古一下。
|
||||
|
||||
随着时间推移,星球沉淀的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **166/年**!后续会将星球的价格调整为 **196/年**,想要加入的小伙伴一定要尽早。
|
||||
|
||||
这里再送一个 **30** 元的星球专属优惠券吧,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
|
||||
这里再送一个 **30** 元的星球专属优惠券,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
|
||||
|
||||

|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user