項目排坑小計:mysql數據庫插入字符串附帶emoji表情發生報錯的通常狀況及解決方法

首先先喊一句:武漢加油!java

疫情應該也快結束了,咱們公司也迎來了復工,在家辦公的這幾天裏,忽然負責的中心傳來線上的噩耗:mysql

線上生產某接口出問題了!git

通過排查,原來是某接口的保存接口在接收微信傳來的微信暱稱往咱們中心數據庫插數據的時候因爲附帶emoji,報錯了!github

我說奇怪,這種問題不該該啊,總所周知,目前mysql數據庫的支持算是比較完備的,只要數據庫的字符集設置成utf8mb4sql

果不其然, 查了線上的數據庫字符集,果真不是utf8mb4而是utf8!數據庫

1.緣由:

UTF-8編碼有多是兩個、三個、四個字節。Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,因此數據插不進去。windows

對應的解決方案1:

很是簡單,只要一開始設置數據庫的字符集或者數據表字段的字符集爲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.若是隻是某個字段須要 只須要修改那個字段的字符集就能夠了

重點來了

可是很是惋惜,這是咱們線上環境使用的數據庫,字符集一旦已經使用,修改字符集容易對目前存量的數據顯示形成問題。

因此咱們只能在不對數據庫字符集進行更改的狀況下,來彌補現有的缺陷。。

解決方法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)ノ

相關文章
相關標籤/搜索