【MySql】保存emoji表情
前言
数据库版本:阿里-MySql8
字符集:utf8
排序规则:utf8_general_cli
在插入数据时,如果数据包含emoji表情
会报错:
Incorrect string value: '\xF0\x9F\x98\x82' for column 'content' at row 1
原因
mysql中的”utf8“最大只支持3 个bytes,而真正的utf8编码(大家都使用的标准),最大支持4个bytes。
正是由于mysql的utf8少一个byte,导致中文的一些特殊字符和emoji都无法正常的显示。
mysql真正的utf8其实是utf8mb4,这是在5.5版本之后加入的。
而目前的“utf8”其实是utf8mb3。mb就是 max bytes的意思(猜测)。
所以尽量不要使用默认的utf8,使用utf8mb4才是正确的选择。
解决方案
方案一
调整MySql数据库的字符集和排序规则,将utf8修改为utf8mb4。
网上有很多完整的处理方案
参考链接:https://www.cnblogs.com/fozero/p/10472522.html
方案二
将内容进行Base64编码后再进行保存,当时从数据库取出数据后也需要对内容进行Base64解码。
这种方案,不需要调整mysql的配置,也不用考虑各种中间环节的编码问题,缺点是增加了代码量和维护工作。
C#进行Base64编码解码的操作
/// <summary> /// Base64编码,加密。需要注意编码格式 /// </summary> /// <param name="data"></param> /// <returns></returns> public static string ToBase64Encode(this string data) { if (data == null) return null; return Convert.ToBase64String(Encoding.UTF8.GetBytes(data)); } /// <summary> /// Base64解码,解密。需要注意编码格式 /// </summary> /// <param name="data"></param> /// <returns></returns> public static string ToBase64Decode(this string data) { if (data == null) return null; return Encoding.UTF8.GetString(Convert.FromBase64String(data)); }