简介
本文介绍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.