12月04, 2017

mysql存储emoji表情

MySQL的文本类型(varchar,text),对emoji的支持度不是很好,在5.5.3版本之前,MySQL是直接不支持emoji存储的,纵使是utf8编码模式。

其原因在于,MySQL的utf8编码规定一个字符按照3个字节来存储,而emoji缺是用4个字节来存储的。所以导致了,如果强制将emoji存储到varchar,text等字段上时会抛出异常,其认为emoji不是一个正确的字符。

比如我这边使用node做一个查询,条件中包含了一个emoji,就抛出了这么一个错误。

Error: ER_CANT_AGGREGATE_2COLLATIONS: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation xxxx

从5.5开始,MySQL推出了utf8mb4编码格式用于解决这个问题,utf8mb4是utf8的超集,可以向下兼容utf8,同时又支持更大的字符集。

解决办法

如上所说,我们可以使用utf8mb4编码来实现emoji的存储。当然一个硬性要求就是你的MySQL版本最少大于或等于5.5.3。

将数据库编码改为utf8mb4

set character_set_client      = utf8mb4;                       
set character_set_connection  = utf8mb4;                       
set character_set_database    = utf8mb4;                       
set character_set_results     = utf8mb4;                       
set character_set_server      = utf8mb4;

将已经生成的表编码改为utf8mb4

alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_general_ci;

如果是新建数据库,只需要创建的时候选好编码即可。

数据库连接时使用utf8mb4

具体连接的时候具体配置哈,切莫乱抄一气。

mysql: {
    user: 'root',
    password: '',
    database: 'db',
    host: '127.0.0.1',
    port: 3306,
    prefix: 'table_',
    charset: "utf8mb4",
}

此时重启下项目(如果需要),就可以存储emoji了。

如果数据库版本不好升级,那么可以也有两种方法来实现:

  • 将emoji转换为base64来存储,使用的时候再解码回来。
  • 使用特殊字符代替来存储,使用的时候转换回来,比如使用[smile]来代替微笑emoji(火麒麟博客系统也不支持emoji,尴尬!),存储在数据库中,使用的时候相应变换回来就可以了。

本文链接:https://luodao.me/post/mysql-emoji.html

-- EOF --

Comments