Rails & MySQL 使用 emoji 时 Incorrect string value 解决方法

当在 charset 为 utf-8 的 MySQL 中插入 emoji 时,数据库会报错 Incorrect string value
仔细一想,这很奇怪。因为 emoji 本身可以通过 utf-8 来表示,作为 utf-8 的 MySQL 表来说报错实在是太不应该了。
查了之后,才发现原来 MySQL 的 utf-8 是不完全的,只支持 1-3 个字节,而 emoji 的 utf-8 编码大多为 4 个字节。为了支持更多的字符集,MySQL 5.5 推出了编码 utf8mb4,使其可以兼容 4 字节的 emoji。
因此,若要让数据库支持 emoji,可以将编码从 utf-8 改为 utf8mb4。

对于新创建的表这样没有问题,但对于旧有的表来说更改字符集代价很大。有没有一个更简单的方法来实现呢?
对 Rails 来说是有的。可以通过 serialize 来实现。

1
2
3
class Post < ActiveRecord::Base
serialize :content
end

这时存储 emoji 时,就会先进行 serialize 再存入数据库。由于不是直接以 emoji 的 utf-8 编码存储,MySQL 也就不会报错了。

参考