utf8mb4
字符集具有以下特征:
- 支持
BMP
(Basic Multilingual Plane
基本多语种平面 )和 补充字符(Supplementary Multilingual Plane
补充多语种平面) - 每个多字节字符最多需要四个字节。
utf8mb4
与utf8mb3
字符集形成对比,后者只支持BMP
字符,每个字符最多使用三个字节- 对于
BMP
字符,utf8mb4
和utf8mb3
具有相同的存储特征:相同的码值、相同的编码、相同的长度。 - 对于补充字符,
utf8mb4
需要4个字节来存储它,而utf8mb3
根本不能存储该字符。在将utf8mb3
列转换为utf8mb4
列时,不需要担心转换补充字符,因为没有补充字符。 utf8mb4
是utf8mb3
的超集,所以对于下面这样的连接操作,结果是字符集utf8mb4
和排序规则utf8mb4_col
:
SELECT CONCAT(utf8mb3_col, utf8mb4_col);
结论:
数据库或者数据表的字段值由utf8mb3
迁移到utf8mb4
,由于utf8mb4
和utf8mb3
具有相同的存储特征:相同的码值、相同的编码、相同的长度所以并不会出现乱码的问题。
处理方案:
- 只更改目前发生影响的数据库字段列
ALTER TABLE author_info MODIFY COLUMN address VARCHAR(255) CHARACTER SET utf8mb4;
- 这个生僻词库不符合要求,这些生僻字都是占用3个字节的生僻字,这里需要占用4个字节的生僻字可以用下面的脚本生成
for i in range(0x20000, 0x20127): # Unicode范围U+20000到U+20126
print(chr(i).encode('utf-8').decode('utf-8'))
- 修改目前发生影响的数据库表的字符集编码
ALTER TABLE author_info CONVERT TO CHARACTER SET utf8mb4;