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

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

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

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


     com.vdurmont
     -
    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编码,这样就不会有这样的问题,而且具备原生的向后兼容性。

转载请注明:转自《如何解决emoji符号存储到mysql数据库乱码的问题
本文地址:https://www..com/archives-10805.html

赞赏

微信赞赏支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

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

电话:15665730355