插入emoji表情到mysql 錯誤SQLException Incorrect string value xxx
遇到這個問題首先想到的是編碼問題
emoji表情儲存到資料庫,要求欄位編碼是utf8mb4。
查看了一下資料庫編碼是latin1
show variables like 'character_set%'
解決辦法是修改欄位,表,資料庫編碼為utf8mb4。但是這種改動太大。
1、擔心修改引起其它地方的問題
2、經測試改了也沒有用
為什麼沒用呢,還需要修改伺服器的mysql.ini配置
修改這個配置後,最新的mysql5以上的驅動就會自動識別為utf8mb4
但是修改這個改動就更大了,因為公司的資料庫伺服器上面,不止我一個專案的資料庫。
網上還有一種方式,就是使用URLDecoder.encode一下,然後顯示的時候decode一下
但是這種方式:
1、每個地方都要考慮到,修改的地方太多
2、encode後的字串超級長,隨便幾個emoji表情長度就幾十了,而我只是一個暱稱而已
摸索中。。。
無奈升級一下驅動試試,直接從mysql connector5升級到了8
首先修改driverClass和url。這2處不修改,啟動會報錯。網上說涉及時區問題,所以+8,但是測試發現加不加都沒問題。猜想可能的原因是資料庫時間已經是北京時間,想想還是加上GMT%2B8
com.mysql.cj.jdbc.Driver
jdbc:mysql://192.168.xxx:3306/xxx?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
修改表的欄位編碼:
ALTER TABLE test MODIFY nick_name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE test CONVERT TO CHARACTER SET utf8mb4;//表的修改經測試可有可無,但是如果有其它表引用了當前表,是無法修改的,所以不改也罷
擼了一個測試用例,測試一下,完美執行,說明最新的mysql驅動已經支援emoji了,不需要修改伺服器的mysql配置。