Java 处理 Emoji 表情,存入数据库

555 阅读2分钟

最近领导让我研究一下 Emoji 存入数据库的问题,所以写这篇文章来记录一下

一、第一种解决方式,直接转换

1. 依赖

我采用的是 mysql-5.7.18 版本,SpringBoot 是 2.7

需要导入 emoji-java 包

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

2. 前端

才用的是 Thymeleaf

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div th:each="e:${emojis}">
        <span th:text="${e.id}"></span>
        <span th:text="${e.emojiText}"></span>
        <span th:text="${e.by1}"></span>
    </div>

<!--    /*@thymesVar id="emoji" type="com.example.emoji_mysql.domain.Emoji"*/-->
    <form name=”form” method="post" th:action="@{/add}" th:object="${emoji}">
        <label>表情
            <input type="text" th:field="*{emojiText}">
        </label>
        <label>备注
            <input type="text" th:field="*{by1}">
        </label>
        <input type="submit" name="submit" value="提交">
    </form>
</body>
</html>

3. 后端

3.1 Controller

@RequestMapping
@Controller
public class IndexController {

    @Autowired
    EmojiService emojiService;

    @RequestMapping("/index")
    public String index(ModelMap map,Model model){
        // 查询数据库中所有的数据
        List<Emoji> list = emojiService.list();
        // 将 emoji 的编码转为 表情
        Collection<Emoji> collect = list.stream().map(e -> {
            // parseToUnicode:转为 unicode 编码,浏览器可识别
            e.setEmojiText(EmojiParser.parseToUnicode(e.getEmojiText()));
            return e;
        }).collect(Collectors.toList());

        // 前端遍历的数据
        map.put("emojis", collect);

        // 创建一个新的对象,传给前端,因为 thymeleaf 上传的话是需要一个空对象的
        Emoji emoji = new Emoji();
        model.addAttribute("emoji",emoji);
        return "index";
    }

    @PostMapping(value = "/add")
    public String add(@ModelAttribute("emoji") Emoji emoji, Model model){
        emoji.setId(UUID.randomUUID().toString());
        // 将前端传递过来的数据转为 表情的别名,便于存入数据库中
        String s = EmojiParser.parseToAliases(emoji.getEmojiText());
        emoji.setEmojiText(s);

        // 保存
        emojiService.save(emoji);
        return "index";
    }
}

业务层处理的话直接继承 IService 即可

3.2 数据库

CREATE TABLE `emoji_test`.`emoji` ( `id` VARCHAR(32) NOT NULL, `emoji_text` VARCHAR(256), `by1` VARCHAR(256), PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 

第一种方法结果

f1c79f3155e72056f09613dfdf10743.png

e593c5887e65d463b5b1191a8ec0f12.png

第二种方法,修改数据库

修改数据库需要 my.cnf 文件,5.7.18之后,如果是用压缩包安装的方式,那么文件夹是没有 my.cnf 这个文件的。

1. 创建 my.cnf 文件

  1. 停止 mysql 服务,因为是压缩安装的,使用这个命令:pkill mysql
  2. vim /etc/my.cnf
  3. 写入参数
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4' 

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
  1. 重启 mysql,去 mysql 的 bin 目录下,./mysqld_safe &
  2. 进入 Mysql,./mysql -uroot -p
  3. 查看编码
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

如果是新创建的表的话,需要设置字符集

image.png

如果是已经存在的表需要修改的话

//修改数据库字符集编码
ALTER DATABASE 你的表名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

//修改表字符集编码
ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

//修改字段字符集编码
ALTER TABLE 你的表名 table_name CHANGE column_name VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

数据库配置

image.png

第二章方式结果

image.png

对你有帮助的话记得点个赞哦!