@@ -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
133142cmake . -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
212224SELECT * 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客户端程序
232242default-character-set =utf8mb4
233243```
234244
235- - 使用SQL语句
236-
237- 比如:
245+ 2、使用 SQL 语句
238246
239247``` sql
240248set 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