1. 程式人生 > >解決Emoji儲存MySQL亂碼問題

解決Emoji儲存MySQL亂碼問題

在解決之前,得先說明一下為什麼會出現亂碼,Emoji表情佔用4個位元組,但是MySQL資料庫UTF-8編碼最多隻能儲存3個位元組,就會導致儲存不進去,在讀取的時候讀取不完整,導致亂碼,那Unicode和UTF-8有什麼區別呢?

總的就一句話,UTF-8是Unicode的一種實現。

Github解決方案地址: 

一、如何解決Emoji儲存問題

再來摘抄一遍自己的筆記:mysql 的 utf8編碼的一個字元最多3個位元組,但是一個emoji表情為4個位元組,所以utf8不支援儲存emoji表情。但是utf8的超集utf8mb4一個字元最多能有4位元組,所以能支援emoji表情的儲存。但是修改這個配置太繁瑣了,容易出錯,emoji-java這個庫可以在程式碼段解決這個問題,解決思路:

  • 頁面有一個表情?,在經過處理之後可以是?,將這個字元存入資料庫
  • 讀取的時候可以將?這個字元轉為?

例如: ? 我可以儲存為:smile:,?儲存為:cry:,等等,可以這樣對映起來。

1、引入依賴

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

2、常用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); 將字元轉為表情符號

3、案例

  • 儲存圖片
  • 插入表情

  • 資料庫儲存記錄

查詢出的資料

資料庫儲存格式

查詢該記錄