mysql數據庫插入字符串附帶emoji表情發生報錯的一般情況及解決方法

疫情應該也快結束了,我們公司也迎來了復工,在家辦公的這幾天裏,突然負責的中心傳來線上的噩耗:
線上生產某接口出問題了!
經過排查,原來是某接口的保存接口在接收微信傳來的微信暱稱往我們中心數據庫插數據的時候由於附帶emoji,報錯了!

我說奇怪,這種問題不應該啊,總所周知,目前mysql數據庫的支持算是比較完備的,只要數據庫的字符集設置成utf8mb4!
果不其然, 查了線上的數據庫字符集,果然不是utf8mb4而是utf8!

1.原因:
UTF-8編碼有可能是兩個、三個、四個字節。Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,所以數據插不進去。
對應的解決方案1:
非常簡單,只要一開始設置數據庫的字符集或者數據表字段的字符集爲utf8mb4 即可。
將Mysql的編碼從utf8轉換成utf8mb4。詳細說明如下:
首先停止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.如果只是某個字段需要 只需要修改那個字段的字符集就可以了
重點來了
但是非常可惜,這是我們線上環境使用的數據庫,字符集一旦已經使用,修改字符集容易對目前存量的數據顯示造成問題。
所以我們只能在不對數據庫字符集進行更改的情況下,來彌補現有的缺陷。。
解決方法2
想到的方法就是:對獲取的emoji表情進行轉碼了,使其能在utf8字符集下轉碼爲字符串進行保存。
附帶一個前輩開發的比較好用的工具包:

Emoji轉換工具,便於各種規格客戶端生成的Emoji字符串轉換成另外一種格式

com.github.binarywang
java-emoji-converter
0.1.1


xstream
com.thoughtworks.xstream


guava
com.google.guava



複製代碼寫出一個工具方法:
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)ノ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章