mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
Update character-set.md
This commit is contained in:
parent
e35101ac05
commit
adff2d8772
@ -116,26 +116,38 @@ MySQL 支持很多种字符编码的方式,比如 UTF-8、GB2312、GBK、BIG5
|
||||
|
||||
MySQL 中的字符集有以下的层次级别:
|
||||
|
||||
- `server`
|
||||
- `database`
|
||||
- `table`
|
||||
- `column`
|
||||
- `server`(MySQL 实例级别)
|
||||
- `database`(库级别)
|
||||
- `table`(表级别)
|
||||
- `column`(字段级别)
|
||||
|
||||
它们的优先级可以简单的认为是从上往下依次增大,也即 `column` 的优先级会大于 `table` 等其余层次的
|
||||
它们的优先级可以简单的认为是从上往下依次增大,也即 `column` 的优先级会大于 `table` 等其余层次的。如指定 MySQL 实例级别字符集是`utf8mb4`,指定某个表字符集是`latin1`,那么这个表的所有字段如果不指定的话,编码就是`latin1`。
|
||||
|
||||
#### server
|
||||
|
||||
不同版本的 MySQL 其 `server` 级别的字符集默认值不同,在 MySQL5.7 中,其默认值是 `latin1` ;在 MySQL8.0 中,其默认值是 `utf8mb4` 。
|
||||
|
||||
当然也可以通过在启动 `mysqld` 时指定 `--character-set-server` 来设置 `server` 级别的字符集。或者如果你是通过源码构建的方式启动的MySQL,你可以在 `cmake` 命令中指定选项:
|
||||
当然也可以通过在启动 `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` 级别的字符集可以在我们使用 `create database` 语句未指定字符集时被用作默认值,同时它还可能会对连接字符集产生影响,这个可以查看 **[`MySQL Connector/J 8.0` 文档](https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html)**。
|
||||
`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
|
||||
|
||||
@ -151,7 +163,7 @@ ALTER DATABASE db_name
|
||||
[[DEFAULT] COLLATE collation_name]
|
||||
```
|
||||
|
||||
如前面所说,如果在执行上述语句时未指定字符集,那么MySQL将会使用 `server` 级别的字符集。这里关于字符集是如何选择的,还有一些比较细致的规则,建议自己翻阅MySQL文档。
|
||||
如前面所说,如果在执行上述语句时未指定字符集,那么 MySQL 将会使用 `server` 级别的字符集。
|
||||
|
||||
可以通过下面的方式查看某个数据库的字符集:
|
||||
|
||||
@ -179,7 +191,7 @@ ALTER TABLE tbl_name
|
||||
[COLLATE collation_name]
|
||||
```
|
||||
|
||||
如果在创建表和修改表时未指定字符集,那么将会使用 `database` 级别的字符集。这里关于字符集是如何选择的,还有一些比较细致的规则,建议自己翻阅MySQL文档。
|
||||
如果在创建表和修改表时未指定字符集,那么将会使用 `database` 级别的字符集。
|
||||
|
||||
#### column
|
||||
|
||||
@ -194,7 +206,7 @@ CREATE TABLE t1
|
||||
);
|
||||
```
|
||||
|
||||
如果未指定列级别的字符集,那么将会使用表级别的字符集。这里关于字符集是如何选择的,还有一些比较细致的规则,建议自己翻阅MySQL文档。
|
||||
如果未指定列级别的字符集,那么将会使用表级别的字符集。
|
||||
|
||||
### 连接字符集
|
||||
|
||||
@ -202,9 +214,9 @@ CREATE TABLE t1
|
||||
|
||||
连接字符集与下面这几个变量息息相关:
|
||||
|
||||
- `character_set_client` (描述了客户端发送给服务器的SQL语句使用的是什么字符集)
|
||||
- `character_set_connection` (描述了服务器接收到SQL语句时使用什么字符集进行翻译)
|
||||
- `character_set_results` (描述了服务器返回给客户端的结果使用的是什么字符集)
|
||||
- `character_set_client` :描述了客户端发送给服务器的 SQL 语句使用的是什么字符集。
|
||||
- `character_set_connection` :描述了服务器接收到 SQL 语句时使用什么字符集进行翻译。
|
||||
- `character_set_results` :描述了服务器返回给客户端的结果使用的是什么字符集。
|
||||
|
||||
它们的值可以通过下面的 SQL 语句查询:
|
||||
|
||||
@ -222,19 +234,15 @@ SHOW SESSION VARIABLES LIKE 'character\_set\_%';
|
||||
|
||||
如果要想修改前面提到的几个变量的值,有以下方式:
|
||||
|
||||
- 修改配置文件
|
||||
1、修改配置文件
|
||||
|
||||
比如加上:
|
||||
|
||||
```
|
||||
```properties
|
||||
[mysql]
|
||||
# 只针对MySQL客户端程序
|
||||
default-character-set=utf8mb4
|
||||
```
|
||||
|
||||
- 使用SQL语句
|
||||
|
||||
比如:
|
||||
2、使用 SQL 语句
|
||||
|
||||
```sql
|
||||
set names utf8mb4
|
||||
@ -257,7 +265,7 @@ set names utf8mb4
|
||||
|
||||
以 `DataGrip 2023.1.2` 来说,在它配置数据源的高级对话框中,可以看到 `characterSetResults` 的默认值是 `utf8` ,在使用 `mysql-connector-java 8.0.25` 时,连接字符集最后会被设置成 `utf8mb3` 。那么这种情况下 emoji 表情就会被显示为问号,并且当前版本驱动还不支持把 `characterSetResults` 设置为 `utf8mb4` ,不过换成 `mysql-connector-java driver 8.0.29` 却是允许的。
|
||||
|
||||
具体可以看一下StackOverflow的 **[这个回答](https://stackoverflow.com/questions/54815419/datagrip-mysql-stores-emojis-correctly-but-displays-them-as/76625399#76625399)**。
|
||||
具体可以看一下 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 使用
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user