最近在公司的APP項目中出現了,手機移動端輸入法輸入Emoji表情和火星文等特殊字符時,後臺接口存入數據庫報錯的問題。錯誤爲以下形式html
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1
如下過程主要參考了阿里雲官方幫助文檔《RDS MySQL使用utf8mb4字符集存儲emoji表情》java
在數據庫client終端查看數據庫是否支持utf8mb4編碼方式mysql
SHOW CHAR SET WHERE Charset LIKE "%utf8%";
在RDS控制檯-參數配置功能中修改character_set_server參數爲utf8mb4。spring
修改後須要重啓實例方可生效。 sql
RDS for MySQL數據庫並不支持修改編碼方式,因此要經過新建數據表,而後導數據的方式進行變動。數據庫
原來已經生成的數據表須要修改編碼方式測試
-- ex_company 爲要修改的表名 ALTER TABLE ex_company CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
*修改編碼方式的過程當中出現了兩個問題阿里雲
1)現了一個錯誤「utf8mb4 Specified key was too long; max key length is 767 bytes」編碼
此錯誤的問題在於MySQL數據庫創建索引的字段不能超過767個字節,若是創建索引的字段原來是utf8編碼(3字節),那麼255*3=765能夠創建爲索引。如今若是改爲utf8mb4編碼(4字節),那麼255*4=1020顯然超過767個字節的規定。能夠將創建索引的字段字符數改少(191正好764)來解決此問題。url
alter table ex_order_base modify column sn varchar(191);
2)沒有varchar類型字段的數據表編碼格式不會改,沒弄清楚爲何。
去掉jdbc連接參數中的「useUnicode=true」和「characterEncoding=UTF-8」參數
修改前:
spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/pltx-test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
修改後:
spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/pltx-test?zeroDateTimeBehavior=convertToNull
至此本次變動完成,連接客戶端測試一切正常。