简介

        本文介绍MySQL的字符集。

utf8与utf8mb4

utf8mb4是utf8的超集。它们的区别如下

utf8

utf8mb4

最大字符长度

3字节

插入 4 字节的宽字符会报异常

4字节

mb4:most bytes 4

起始版本

5.5.3

包含的字符

只包含基本多语言面 (Basic Multilingual Plane,BMP)字符。

不包含特殊字符(详见右边)

包含基本多语言面 (Basic Multilingual Plane,BMP)字符。(和utf8相同的代码值,相同的编码,相同的长度。)

包含特殊字符:Emoji 表情、不常用的汉字,新增的 Unicode 字符

utf8升级utf8mb4

说明

utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。原因:

  • 对于 BMP字符 UTF8 和 utf8mb4 具有相同的存储特性:相同的代码值,相同的编码,相同的长度。
  • 对于补充字符,UTF8不能储存所有的字符,而utf8mb4需要四个字节来存储它。因为UTF8不能存储所有的字符,你的 utf8 列中都没有补充字符,因此从旧版本的MySQL UTF8 升级数据时 不用担心字符转换或丢失数据。

法1:使用命令

# 修改数据库:  
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;  
# 修改表:  
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  
# 修改表字段:  
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

法2:使用配置文件

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

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

执行命令查看结果

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     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

character_set_database:就是数据库内部存储字符串用的编码
character_set_connection :就是通过socket与mysql通信时的网络编码
character_set_client:mysql命令终端和navicat都属于客户端

如何选用

        建议普通表使用utf8, 如果这个表需要支持emoji就使用utf8mb4(注意: 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。)。

        如果不知道用什么合适,用utf8,后期需要再升级为utf8mb4.