前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、mysql 无法存储表

1、问题和背景

博主在开发微信公众号获取用户姓名的时候,出现了很大的问题,一开始只是设计的数据库的编码为UTF-8,但是在当用户的 nickName 设置为表情的符号的时候就会出错,

utf8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。其中 Emoji 表情是4个字节,而MySqlutf8 编码最多 3 个字节,所以导致了数据插不进去。

WX20180607-154736@2x

2、解决

mysql 从 5.5.3 开始支持 utf8mb4

-- 创建数据库
create database duodian default character set utf8mb4 collate utf8mb4_unicode_ci ;

-- 修改数据库
ALTER DATABASE duodianyouhui CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ;

-- 修改表
ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;

-- 修改字段
alter table user_info modify column nickName varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

二、存储表情是乱码

前面的已经介绍了怎么存储 Emoji, 但是我们会发现存到库里是乱码的形式,但是乱码又能怎么样的,能用不就行了。但是我们非让他不显示乱码怎么办呢,有解决方式。这里的解决方式不仅针对 utfbm4 针对 utf8 也是管用的

1、pom.xml

<dependency>
     <groupId>com.vdurmont</groupId>
     <artifactId>emoji-java</artifactId>
    <version>3.2.0</version>
</dependency>

2、表情 string 转化

原理:😁我可以存储为:smile:,😭存储为:cry:,等等,可以这样映射起来。

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


@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;
}

WX20180607-162928@2x

ContactAuthor