node + mysql保存Emoji失败乱码问题
背景
开发环境: win + node(egg) + mysql
用户自定义消息需要保存到mysql数据库,消息可能包含Emoji,直接保存消息时Emoji乱码变成????.
解决
直接先说解决办法:
① 修改mysql数据库的字符集改为 utf8mb4,
② 同时设置node mysql连接chareset为 utf8mb4 即可。
这种方式有个缺点就是不兼容 mysql 5.5.3 之前的版本,如果要考虑兼容老版本请采用其他方式。
问题原因
数据库的字符编码我们一般设置为 utf8,这里我们出问题也是设置的 utf8, utf8字符编码支持的编码范围为 \u0000-\uFFFF,而 Emoji 所在的编码范围是 \u1F601-\u1F64F,超出 MySql 的边界了,所以直接保存Emoji会出问题。utf8mb4 是 MySql 在 5.5.3 版本之后新增的编码方式,目的就是用来用来兼容四字节的 Unicode,其中就包括 Emoji。
同时数据库连接配置的chareset也修改为 utf8mb4,这样读取Emoji的时候才能正常读取。