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("utf-8");
            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,"utf-8");
        } catch (IOException e) {
            log.info("base64解密拋出異常:" + e);
        }
        return null;
    }

在新增的時候,把字段單獨提取出來進行編碼處理,在獲取的時候把數據字段取出來進行解碼處理,這樣就完成了。

要注意下編碼格式問題,之前沒有使用“utf-8”的編碼格式,結果在部署到其他環境時出現亂碼現象,就是因爲編碼和解碼的在不同環境設置的編碼格式不統一。

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