如何解决emoji符号存储到mysql数据库乱码的问题

 出现问题的原因是的utf-8编码只支持3个字节的数据,而移动端的emoji是四个字节的数据,如果直接往utf-8编码的中插入表情,就会报上面的错误。
第一种解决办法是的编码修改,修改为utf8的超集utf8mb4支持4个字节的字符。
  utf8mb4编码兼容utf-8,是utf-8编码的超集,能存储4字节的表情字符。
  1,将存储表情字符的表改为utf8mb4,
  2,utf8mb4支持的版本最低为5.5.3+。
  3,修改配置文件my.cnf(windows为my.ini)。
    [client]
    port=3306
    []
    default-character-set=utf8mb4
    [mysqld]
    character-set-server=utf8mb4
  4,重启服务。
  5,修改连接的配置
    characterEncoding=utf8会被自动识别成utf8mb4,可以不加这个参数,
  重新测试,发现已经可以存储表情字符了。 

第二种办法,不修改数据库,改代码端也可以解决这个问题:
emoji-java这个库可以在代码段解决这个问题,解决思路:

页面有一个表情?,在经过处理之后可以是?,将这个字符存入数据库
读取的时候可以将?这个字符转为?
例如: ? 我可以存储为:smile:,?存储为:cry:,等等,可以这样映射起来。


     com.vdurmont
     emoji-java
    3.2.0

api实例:

    @RequestMapping("/add/content")
    public ResponseEntity insertContent(@RequestBody Content content) {
        String title = content.getTitle();
 
        String titles = EmojiParser.parseToAliases(title);
        content.setTitle(titles);
        Integer integer = emojiMapper.insertContent(content);
        if (integer == 1) {
           return ResponseEntity.ok().build();
        }
        return  ResponseEntity.badRequest().build();
 
    }
 
    @RequestMapping("/get/{id}")
    public Content getById(@PathVariable("id") Integer id) {
 
        Content content = emojiMapper.selectById(id);
        String title = EmojiParser.parseToUnicode(content.getTitle());
        content.setTitle(title);
        if (content != null) {
            return content;
        }
        return  null;
    }

EmojiParser.parseToAliases(string); 将表情符号转为字符
EmojiParser.parseToUnicode(string); 将字符转为表情符号

综合两种解决办法,各有优劣,数据库编码修改风险较大,需要做好事前备份,要了解数据库编码的修改规则,但是代码端不受影响,也不用做任何额外变动;
添加java库较为简单,但是开发端要作出相应的支持。在数据库设计时,就应该使用utf8mb4编码,这样就不会有这样的问题,而且具备原生的向后兼容性。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《如何解决emoji符号存储到mysql数据库乱码的问题
本文地址:https://www.zhiletu.com/archives-10805.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微