MySQL utf8mb4 字符集

遇到的问题

有一个项目需要存储 emoji 表情。另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错。

Rails creating schema_migrations - Mysql2::Error: Specified key was too long

问题原因

  1. mysql 里的 utf8 一个字符最多 3 字节,只支持 BMP 这部分的 unicode 编码区
  2. BMP 是从哪到哪,基本就是0000~FFFF这一区
  3. utf8mb4 则扩展到一个字符最多能有 4 字节,所以能支持更多的字符集

结论

  1. utf8mb4 兼容 utf8 且比 utf8 能表示更多的字符
  2. 至于什么时候用,看unicode编码区
  3. 从 1 – 126 就属于传统 utf8 区,当然 utf8mb4 也兼容这个区,126 行以下就是 utf8mb4 扩充区,什么时候你需要存储那些字符,你才用 utf8mb4 否则只是浪费空间
  4. 涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集
  5. utf8mb4 是 utf8 的超集

升级步骤

  1. 备份数据库
  2. 升级 MySQL Server 到 v5.5.3+ (低版本不支持这个字符集、复制报错)
  3. 修改 database、table 和 column 字符集

  • 修改 my.cnf

  • 重启 MySQL Server、检查字符集

如何把 emoji 编码转换为 emoji 表情

阿里云 RDS 对 utf8mb4 的支持

RDS 是支持 utf8mb4 编码的。如果在数据库管理界面修改之后,对新创建的表默认就是支持 utf8mb4 ,对已经存在表,在字段上做字符集的修改操作才可以。