關於微信用戶信息包含特殊字符和表情emoji存儲mysql的解決辦法

這是由於字符集不支持的異常,因爲utf-8編碼有可能是兩個,三個,四個字節,其中Emoji表情是四個字節,而mysql的utf-8編碼最多三個字節,所以導致數據插不進去,會拋出異常。
一開始遇到這個問題,也查找了不少資料,主要方案有兩個(數據無損):
一:修改數據庫的編碼格式和配置的編碼格式
數據庫配置修改編碼格式爲utf8mb4
windows下數據庫配置一般是:mysql.ini文件

[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'

mysql上執行:

ALTER DATABASE 數據庫名稱 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE 表名稱 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名稱 CHANGE 字段名稱 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

另外需要java連接mysql的修改:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
jdbc.username=root
jdbc.password=password

本來以爲這樣就可以了,但是還是報同樣的錯誤。最後參考這個文章得以解決問題。

spring-mvc-hibernate.xml文件上修改,這個文件是引入數據源的。
加上一句:這個

<property name="url" value="${jdbc.url}" />
<property name="connectionInitSqls" value="set names utf8mb4;" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

方案二:不用修改數據庫編碼也無需修改mysql配置,只需要對數據編碼存入數據庫,取的時候再解碼出來(個人覺得麻煩)

 //進行編碼
nickName =Base64.encodeBase64String(nickName.getBytes("UTF-8"));
//進行解碼
nickName = new String(Base64.decodeBase64(nickName),"UTF-8");

遇到問題,作爲筆記記錄。

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