Skip to content

Commit adff2d8

Browse files
committed
Update character-set.md
1 parent e35101a commit adff2d8

File tree

1 file changed

+45
-37
lines changed

1 file changed

+45
-37
lines changed

docs/database/character-set.md

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -104,38 +104,50 @@ MySQL 支持很多种字符编码的方式,比如 UTF-8、GB2312、GBK、BIG5
104104

105105
### 查看支持的字符集
106106

107-
你可以通过 `SHOW CHARSET` 命令来查看,支持like和where子句
107+
你可以通过 `SHOW CHARSET` 命令来查看,支持 like 和 where 子句
108108

109109
![](https://oss.javaguide.cn/javaguide/image-20211008164229671.png)
110110

111111
### 默认字符集
112112

113-
在MySQL5.7中,默认字符集是 `latin1`在MySQL8.0中,默认字符集是 `utf8mb4`
113+
在 MySQL5.7 中,默认字符集是 `latin1`在 MySQL8.0 中,默认字符集是 `utf8mb4`
114114

115115
### 字符集的层次级别
116116

117-
MySQL中的字符集有以下的层次级别
117+
MySQL 中的字符集有以下的层次级别
118118

119-
- `server`
120-
- `database`
121-
- `table`
122-
- `column`
119+
- `server`(MySQL 实例级别)
120+
- `database`(库级别)
121+
- `table`(表级别)
122+
- `column`(字段级别)
123123

124-
它们的优先级可以简单的认为是从上往下依次增大,也即 `column` 的优先级会大于 `table` 等其余层次的
124+
它们的优先级可以简单的认为是从上往下依次增大,也即 `column` 的优先级会大于 `table` 等其余层次的。如指定 MySQL 实例级别字符集是`utf8mb4`,指定某个表字符集是`latin1`,那么这个表的所有字段如果不指定的话,编码就是`latin1`
125125

126126
#### server
127127

128-
不同版本的MySQL其 `server` 级别的字符集默认值不同,在MySQL5.7中,其默认值是 `latin1`在MySQL8.0中,其默认值是 `utf8mb4`
128+
不同版本的 MySQL 其 `server` 级别的字符集默认值不同,在 MySQL5.7 中,其默认值是 `latin1`在 MySQL8.0 中,其默认值是 `utf8mb4`
129129

130-
当然也可以通过在启动 `mysqld` 时指定 `--character-set-server` 来设置 `server` 级别的字符集。或者如果你是通过源码构建的方式启动的MySQL,你可以在 `cmake` 命令中指定选项:
130+
当然也可以通过在启动 `mysqld` 时指定 `--character-set-server` 来设置 `server` 级别的字符集。
131+
132+
```bash
133+
mysqld
134+
mysqld --character-set-server=utf8mb4
135+
mysqld --character-set-server=utf8mb4 \
136+
--collation-server=utf8mb4_0900_ai_ci
137+
```
138+
139+
或者如果你是通过源码构建的方式启动的 MySQL,你可以在 `cmake` 命令中指定选项:
131140

132141
```sh
133142
cmake . -DDEFAULT_CHARSET=latin1
143+
或者
144+
cmake . -DDEFAULT_CHARSET=latin1 \
145+
-DDEFAULT_COLLATION=latin1_german1_ci
134146
```
135147

136-
此外,你也可以在运行时改变 ` character_set_server` 的值,从而达到修改 `server` 级别的字符集的目的。
148+
此外,你也可以在运行时改变 `character_set_server` 的值,从而达到修改 `server` 级别的字符集的目的。
137149

138-
`server` 级别的字符集可以在我们使用 `create database` 语句未指定字符集时被用作默认值,同时它还可能会对连接字符集产生影响,这个可以查看 **[`MySQL Connector/J 8.0` 文档](https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html)**
150+
`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)
139151

140152
#### database
141153

@@ -151,7 +163,7 @@ ALTER DATABASE db_name
151163
[[DEFAULT] COLLATE collation_name]
152164
```
153165

154-
如前面所说,如果在执行上述语句时未指定字符集,那么MySQL将会使用 `server` 级别的字符集。这里关于字符集是如何选择的,还有一些比较细致的规则,建议自己翻阅MySQL文档
166+
如前面所说,如果在执行上述语句时未指定字符集,那么 MySQL 将会使用 `server` 级别的字符集。
155167

156168
可以通过下面的方式查看某个数据库的字符集:
157169

@@ -179,7 +191,7 @@ ALTER TABLE tbl_name
179191
[COLLATE collation_name]
180192
```
181193

182-
如果在创建表和修改表时未指定字符集,那么将会使用 `database` 级别的字符集。这里关于字符集是如何选择的,还有一些比较细致的规则,建议自己翻阅MySQL文档。
194+
如果在创建表和修改表时未指定字符集,那么将会使用 `database` 级别的字符集。
183195

184196
#### column
185197

@@ -194,19 +206,19 @@ CREATE TABLE t1
194206
);
195207
```
196208

197-
如果未指定列级别的字符集,那么将会使用表级别的字符集。这里关于字符集是如何选择的,还有一些比较细致的规则,建议自己翻阅MySQL文档。
209+
如果未指定列级别的字符集,那么将会使用表级别的字符集。
198210

199211
### 连接字符集
200212

201-
前面说到了字符集的层次级别,它们是和存储相关的。而连接字符集涉及的是和MySQL服务器的通信
213+
前面说到了字符集的层次级别,它们是和存储相关的。而连接字符集涉及的是和 MySQL 服务器的通信
202214

203215
连接字符集与下面这几个变量息息相关:
204216

205-
- `character_set_client` (描述了客户端发送给服务器的SQL语句使用的是什么字符集)
206-
- `character_set_connection` (描述了服务器接收到SQL语句时使用什么字符集进行翻译)
207-
- `character_set_results` 描述了服务器返回给客户端的结果使用的是什么字符集
217+
- `character_set_client` :描述了客户端发送给服务器的 SQL 语句使用的是什么字符集。
218+
- `character_set_connection` :描述了服务器接收到 SQL 语句时使用什么字符集进行翻译。
219+
- `character_set_results` 描述了服务器返回给客户端的结果使用的是什么字符集
208220

209-
它们的值可以通过下面的SQL语句查询
221+
它们的值可以通过下面的 SQL 语句查询
210222

211223
```sql
212224
SELECT * FROM performance_schema.session_variables
@@ -222,19 +234,15 @@ SHOW SESSION VARIABLES LIKE 'character\_set\_%';
222234

223235
如果要想修改前面提到的几个变量的值,有以下方式:
224236

225-
- 修改配置文件
237+
1、修改配置文件
226238

227-
比如加上:
228-
229-
```
239+
```properties
230240
[mysql]
231241
# 只针对MySQL客户端程序
232242
default-character-set=utf8mb4
233243
```
234244

235-
- 使用SQL语句
236-
237-
比如:
245+
2、使用 SQL 语句
238246

239247
```sql
240248
set names utf8mb4
@@ -244,22 +252,22 @@ set names utf8mb4
244252
# SET collation_connection = utf8mb4;
245253
```
246254

247-
### jdbc对连接字符集的影响
255+
### jdbc 对连接字符集的影响
248256

249-
不知道你们有没有碰到过存储emoji表情正常,但是使用类似Navicat之类的软件的进行查询的时候,发现emoji表情变成了问号的情况。这个问题很有可能就是jdbc驱动引起的
257+
不知道你们有没有碰到过存储 emoji 表情正常,但是使用类似 Navicat 之类的软件的进行查询的时候,发现 emoji 表情变成了问号的情况。这个问题很有可能就是 jdbc 驱动引起的
250258

251-
根据前面的内容,我们知道连接字符集也是会影响我们存储的数据的,而jdbc驱动会影响连接字符集
259+
根据前面的内容,我们知道连接字符集也是会影响我们存储的数据的,而 jdbc 驱动会影响连接字符集
252260

253-
`mysql-connector-java`jdbc驱动)主要通过这几个属性影响连接字符集:
261+
`mysql-connector-java`jdbc 驱动)主要通过这几个属性影响连接字符集:
254262

255263
- `characterEncoding`
256264
- `characterSetResults`
257265

258-
`DataGrip 2023.1.2` 来说,在它配置数据源的高级对话框中,可以看到 `characterSetResults` 的默认值是 `utf8` ,在使用 `mysql-connector-java 8.0.25` 时,连接字符集最后会被设置成 `utf8mb3`那么这种情况下emoji表情就会被显示为问号,并且当前版本驱动还不支持把 `characterSetResults` 设置为 `utf8mb4` ,不过换成 `mysql-connector-java driver 8.0.29` 却是允许的。
266+
`DataGrip 2023.1.2` 来说,在它配置数据源的高级对话框中,可以看到 `characterSetResults` 的默认值是 `utf8` ,在使用 `mysql-connector-java 8.0.25` 时,连接字符集最后会被设置成 `utf8mb3`那么这种情况下 emoji 表情就会被显示为问号,并且当前版本驱动还不支持把 `characterSetResults` 设置为 `utf8mb4` ,不过换成 `mysql-connector-java driver 8.0.29` 却是允许的。
259267

260-
具体可以看一下StackOverflow的 **[这个回答](https://stackoverflow.com/questions/54815419/datagrip-mysql-stores-emojis-correctly-but-displays-them-as/76625399#76625399)**
268+
具体可以看一下 StackOverflow 的 [DataGrip MySQL stores emojis correctly but displays them as?](https://stackoverflow.com/questions/54815419/datagrip-mysql-stores-emojis-correctly-but-displays-them-as)这个回答
261269

262-
### UTF-8使用
270+
### UTF-8 使用
263271

264272
通常情况下,我们建议使用 UTF-8 作为默认的字符编码方式。
265273

@@ -312,6 +320,6 @@ Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'name' at row 1
312320
- GB2312-维基百科:<https://zh.wikipedia.org/wiki/GB_2312>
313321
- UTF-8-维基百科:<https://zh.wikipedia.org/wiki/UTF-8>
314322
- GB18030-维基百科: <https://zh.wikipedia.org/wiki/GB_18030>
315-
- MySQL8文档<https://dev.mysql.com/doc/refman/8.0/en/charset.html>
316-
- MySQL5.7文档<https://dev.mysql.com/doc/refman/5.7/en/charset.html>
317-
- MySQL Connector/J文档<https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html>
323+
- MySQL8 文档<https://dev.mysql.com/doc/refman/8.0/en/charset.html>
324+
- MySQL5.7 文档<https://dev.mysql.com/doc/refman/5.7/en/charset.html>
325+
- MySQL Connector/J 文档<https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html>

0 commit comments

Comments
 (0)