utf8mb4字符集具有以下特征:

  • 支持BMP( Basic Multilingual Plane 基本多语种平面 )和 补充字符( Supplementary Multilingual Plane 补充多语种平面)
  • 每个多字节字符最多需要四个字节。
  • utf8mb4utf8mb3字符集形成对比,后者只支持BMP字符,每个字符最多使用三个字节
  • 对于BMP字符,utf8mb4utf8mb3具有相同的存储特征:相同的码值、相同的编码、相同的长度。
  • 对于补充字符,utf8mb4需要4个字节来存储它,而utf8mb3根本不能存储该字符。在将utf8mb3列转换为utf8mb4列时,不需要担心转换补充字符,因为没有补充字符。
  • utf8mb4utf8mb3的超集,所以对于下面这样的连接操作,结果是字符集utf8mb4和排序规则utf8mb4_col:
SELECT CONCAT(utf8mb3_col, utf8mb4_col);

结论:
数据库或者数据表的字段值由utf8mb3迁移到utf8mb4,由于utf8mb4utf8mb3具有相同的存储特征:相同的码值、相同的编码、相同的长度所以并不会出现乱码的问题。
处理方案:

  • 只更改目前发生影响的数据库字段列
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;