如何解决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,可以不加这个参数,
重新测试,发现已经可以存储表情字符了。
第二种办法,不修改数据库,改代码端也可以解决这个问题:
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数据库乱码的问题》
本文地址:http://www.xiupu.net/archives-10805.html
关注公众号:
微信赞赏
支付宝赞赏