1.前言
utf8mb4字符集是MySQL 8.0的新默认字符集,这个改变既不影响现有的数据,也不强制任何升级。如果从字符集utf8mb3迁移数据,需要注意迁移后数据最大长度问题。utf8mb4有一个优点是它可以存储更多的符号,包括表情符号。
2.测试
utf8mb4一个字符占4个字节,而utf8mb3是一个字符占3字节。
mysql [localhost:8026] {root} (test) > SET NAMES utf8mb4;
Query OK, 0 rows affected (0.00 sec)
mysql [localhost:8026] {root} (test) > CREATE TABLE test_char
(
-> id
int unsigned NOT NULL AUTO_INCREMENT,
-> c1 char(1),
-> PRIMARY KEY (id
)
-> )CHARACTER SET=utf8mb3;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql [localhost:8026] {root} (test) > INSERT INTO test_char(id,c1) VALUES(1,‘㉿’);
Query OK, 1 row affected (0.01 sec)
mysql [localhost:8026] {root} (test) > CREATE TABLE test_char_2
(
-> id
int unsigned NOT NULL AUTO_INCREMENT,
-> c1 char(1),
-> PRIMARY KEY (id
)
-> )CHARACTER SET=utf8mb4;
Query OK, 0 rows affected (0.01 sec)
mysql [localhost:8026] {root} (test) > INSERT INTO test_char_2(id,c1) VALUES(1,‘㉿’);
Query OK, 1 row affected (0.01 sec)
从这个插入的字符可以看出,utf8mb4可以写入更多的emoji表情。
从空间占用来看,utf8mb4可以存占用4字节的emoji表情。
报超过最大长度,因为mysql varchar最大字节是65535,utf8mb3的最大长度应该是65535/3=21845,而utf8mb4的最大长度为65535/4=16383.这个报错也提示了,如果字段长计超过16383的,只能改为text或longtext数据类型。
3.小结
原字符集uft8mb3迁移到mysql8时,将所有存储超过16383个字符的VARCHAR列转换为TEXT或LONGTEXT数据类型。