解決Emoji儲存MySQL亂碼問題
阿新 • • 發佈:2018-12-13
在解決之前,得先說明一下為什麼會出現亂碼,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、案例
查詢該記錄