1. 程式人生 > >插入emoji表情到mysql 錯誤SQLException Incorrect string value xxx

插入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配置。