這是由於字符集不支持的異常,因爲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");
遇到問題,作爲筆記記錄。