1. 程式人生 > >Caused by: java.sql.SQLException:Incorrect string value:'\xF0\x9F...'

Caused by: java.sql.SQLException:Incorrect string value:'\xF0\x9F...'

使用富文字編輯器儲存emoji圖片時出現

Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84</...' for column 'CONTENT' at row 1

問題,通過百度等方法得知是因為資料庫編碼UTF-8編碼有可能是兩個、三個、四個位元組。Emoji表情或者某些特殊字元是4個位元組,而Mysql的utf8編碼最多3個位元組,所以資料插不進去。有的網站說使用utf8mb4編碼,改變資料庫的服務編碼 表編碼  欄位編碼 ,等於將資料庫中的資料全部進行了更改,這樣明顯是不切實際的,因此,使用最簡單粗暴的方式,直接將資料進行編碼儲存到資料庫中,之後使用解碼的方式進行獲取就好。

我使用的是base64的編解碼方法:

  /**
     * BASE64加密
     *
     * @param data 需要加密的資料
     * @return 加密之後的結果
     */
    public static String encryptBASE64(String data) {
        try {
            byte[] key = data.getBytes();
            return (new BASE64Encoder()).encodeBuffer(key);
        } catch (Exception e) {
            log.info("base64加密丟擲異常:" + e);
        }
        return null;
    }


    /**
     * BASE64解密
     *
     * @param data 需要解密的資料
     * @return 解密之後的資料
     */
    public static String decryptBASE64(String data) {
        try {
            byte[] key = (new BASE64Decoder()).decodeBuffer(data);
            return new String(key);
        } catch (IOException e) {
            log.info("base64解密丟擲異常:" + e);
        }
        return null;
    }

在新增的時候,把欄位單獨提取出來進行編碼處理,在獲取的時候把資料欄位取出來進行解碼處理,這樣就完成了。