最近財神圈項目集成微信登錄功能的過程中,當保存用戶有昵稱含有表情符號時后台服務拋出異常,原來是數據庫默認字符集不支持emoji表情字符。找到問題的原因后,因為之前也沒有遇到過這樣的問題,也沒思路,迅速百度大神找了一大堆資料來,原來僅只要將數據庫及相關的表和表字段設置為utfmb84即支持emoji表情的。
問題的原因是數據庫中使用的字符編碼為UTF-8,這種編碼有可能是兩個、三個、四個字節。Emoji表情是4個字節,而mysql的utf8編碼最多3個字節,所以數據插不進去,而utfmb64是支持四個字節的。所以解決方案就是:將mysql編碼從utf8轉換成utf8mb4。
現將解決的思路和步驟分享一下,為了改過之前寫文章過於草率,盡量將所找的資料和我的實戰經驗寫得完整一下以示尊重讀者。
1,檢測你的數據庫版本,數據庫版本需>=5.5.3版本.
如何察看mysql版本如下圖,我安裝的是mysql下的一個開源分支mariadb,版本10.0對應的是mysql版本5.6以上,所以是支持的。
2,如果你的mysql服務正在啟動中,請右擊我的電腦-管理-服務,關閉mysql server這個服務。
3,設置數據庫默認支持字符集utf8mb4,
找到mysql安裝目錄下的my.cnf或者mysql.ini,修改my.cnf或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'
4,重啟mysql server
檢查字符集
mysq>SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
5,存在的數據庫的字符集是utf8的,如果要支持utf8mb64則需要將已經存在的數據庫、表、表字段類型修改成支持utf8mb64.
修改數據庫字符集:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
修改表的字符集:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改字段的字符集:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
6,這步可有可無,前提是如果使用到 spring boot的連接池,請在spring boot 的配置文件application.properties設置連接使用utf8mb64
spring.mysql.datasource.init-sql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
7,設置連接驅動的JDBC_URL
修改如jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
這里請注意如果數據庫版本大於5.1.13驅動程序connector不能加characterEncoding=utf8,一定要去掉characterEncoding=utf8。
以上步驟測試過很多表的相關字段均都完美解決。