【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));
        }

 

 

 

posted @ 2022-01-20 16:37  我有我奥妙  阅读(333)  评论(0编辑  收藏  举报