首先先喊一句:武漢加油!java
疫情應該也快結束了,咱們公司也迎來了復工,在家辦公的這幾天裏,忽然負責的中心傳來線上的噩耗:mysql
線上生產某接口出問題了!git
通過排查,原來是某接口的保存接口在接收微信傳來的微信暱稱往咱們中心數據庫插數據的時候因爲附帶emoji,報錯了!github
我說奇怪,這種問題不該該啊,總所周知,目前mysql數據庫的支持算是比較完備的,只要數據庫的字符集設置成utf8mb4!sql
果不其然, 查了線上的數據庫字符集,果真不是utf8mb4而是utf8!數據庫
UTF-8編碼有多是兩個、三個、四個字節。Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,因此數據插不進去。windows
很是簡單,只要一開始設置數據庫的字符集或者數據表字段的字符集爲utf8mb4 便可。 將Mysql的編碼從utf8轉換成utf8mb4。詳細說明以下:bash
首先中止MySQL Server服務,修改mysql配置文件 my.cnf(其餘系統)或者mysql.ini(windows系統)微信
[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'
注意: 1.須要 >= MySQL 5.5.3版本、(經檢測5.5.29的也能夠)低版本不支持這個字符集、複製報錯
2.若是隻是某個字段須要 只須要修改那個字段的字符集就能夠了
可是很是惋惜,這是咱們線上環境使用的數據庫,字符集一旦已經使用,修改字符集容易對目前存量的數據顯示形成問題。
因此咱們只能在不對數據庫字符集進行更改的狀況下,來彌補現有的缺陷。。
想到的方法就是:對獲取的emoji表情進行轉碼了,使其能在utf8字符集下轉碼爲字符串進行保存。
附帶一個前輩開發的比較好用的工具包:
Emoji轉換工具,便於各類規格客戶端生成的Emoji字符串轉換成另一種格式
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>java-emoji-converter</artifactId>
<version>0.1.1</version>
<exclusions>
<exclusion>
<artifactId>xstream</artifactId>
<groupId>com.thoughtworks.xstream</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
複製代碼
寫出一個工具方法:
public class EmojiUtils {
/**
* emoji字符alias轉unicode
* @param alias
* @return
*/
public static String toUnicode(String alias){
if(StringUtil.isNotBlank(alias)){
EmojiConverter emojiConverter = EmojiConverter.getInstance();
return emojiConverter.toUnicode(alias);
}
return alias;
}
/**
* emoji字符unicode轉alias
* @param alias
* @return
*/
public static String toAlias(String alias){
if(StringUtil.isNotBlank(alias)){
EmojiConverter emojiConverter = EmojiConverter.getInstance();
return emojiConverter.toAlias(alias);
}
return alias;
}
}
複製代碼
在數據入庫前進行toUnicode轉碼進行保存,
在查詢接口要使用的字段上進行toAlias進行展現。
小坑大功告成
這種坑最好就要防患於未然, 在建庫建表時候最好就將字段設置成utf8mb4,杜絕這種坑的出現纔是最好的(o´ω`o)ノ