数据库编码与词语定序

使用现代编码和定序驱动你的应用程序

如果你安装的数据库版本为 MySQL 8.0,那么其默认的数据库编码为 utf8mb4,默认的 collation(词语定序)为 utf8mb4_0900_ai_ci,使用命令

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

可以查看到

+--------------------------+-------------------------------------------------------+
| Variable_name            | Value                                                 |
+--------------------------+-------------------------------------------------------+
| character_set_client     | utf8mb4                                               |
| character_set_connection | utf8mb4                                               |
| character_set_database   | utf8mb4                                               |
| character_set_filesystem | binary                                                |
| character_set_results    | utf8mb4                                               |
| character_set_server     | utf8mb4                                               |
| character_set_system     | utf8mb3                                               |
| character_sets_dir       | /usr/local/mysql-8.0.28-macos11-arm64/share/charsets/ |
| collation_connection     | utf8mb4_0900_ai_ci                                    |
| collation_database       | utf8mb4_0900_ai_ci                                    |
| collation_server         | utf8mb4_0900_ai_ci                                    |
+--------------------------+-------------------------------------------------------+

如果你安装的数据库版本为 MySQL 5.7,那么默认的数据库编码为 utf8,默认的 collation 是 utf8_general_ci,同样也可以用命令查看到。

数据库编码对比:

编码最大字节数备注

utf8mb3

3

mb3 意为 Max Bytes 3

utf8

3

utf8mb3

utf8mb4

4

mh4 意为 Max Bytes 4

数据库 collation 对比:

Collation解释

_general_ci

general 表示使用了一种简化的 Unicode 排序实现,以达到更好的性能,但是这种性能提升在现代系统中基本可以忽略不计,而且使用它容易导致不希望的排序结果。ci 表示 case insensitive,即大小写不敏感。如果没有特别需求,请勿使用此定序

_unicode_ci

实现 Unicode 4.0 版本的约束。

_unicode_520_ci

实现 Unicode 5.2 版本的约束。

_0900_ai_ci

实现 Unicode 9.0 版本的约束(该定序在 MySQL 5.7 中不存在)。ai 表示 accent insensitive,即方言不敏感,例如 select "a" = "à"; 在使用 utf8mb4_0900_ai_ci 编码和定序的 MySQL 系统中结果是 1。

要修改数据库编码,如果系统为 Mac OS 或者 Linux,请修改 my.cnf,如果是 Windows 则修改 my.ini 为如下配置:

[client] 
default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4 
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_0900_ai_ci
init_connect='SET NAMES utf8mb4'

如果 MySQL 版本为 5.7,则 collation-server 可以应该设置为 utf8mb4_unicode_520_ci

然后重启数据库即可。

重启之后使用命令:

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

得到下表:

+--------------------------+-------------------------------------------------------+
| Variable_name            | Value                                                 |
+--------------------------+-------------------------------------------------------+
| character_set_client     | utf8mb4                                               |
| character_set_connection | utf8mb4                                               |
| character_set_database   | utf8mb4                                               |
| character_set_filesystem | binary                                                |
| character_set_results    | utf8mb4                                               |
| character_set_server     | utf8mb4                                               |
| character_set_system     | utf8mb3                                               |
| character_sets_dir       | /usr/local/mysql-8.0.28-macos11-arm64/share/charsets/ |
| collation_connection     | utf8mb4_0900_ai_ci                                    |
| collation_database       | utf8mb4_0900_ai_ci                                    |
| collation_server         | utf8mb4_0900_ai_ci                                    |
+--------------------------+-------------------------------------------------------+

我们要确认如下字段的值必须为 utf8mb4

系统变量

描述

character_set_client

客户端来源数据使用的字符集

character_set_connection

连接层字符集

character_set_database

当前选中数据库的默认字符集

character_set_results

查询结果字符集

character_set_server

默认的内部操作字符集

如果你已经拥有了一个数据库,那么他的编码可能不会改变,使用命令修改数据库编码:

ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

修改已有表的编码:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

最后,连接数据库时 JDBC url 记得使用这两个参数:

jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&character_set_server=utf8mb4

不要使用 characterEncoding 参数!

最后更新于