文章參考
https://blog.csdn.net/junsure2012/article/details/42171035
https://www.cnblogs.com/WangYunShuaiBaoLe/p/9055215.html
https://www.jb51.net/article/112879.htm
背景
iOS端測試時發現,在備注一欄輸出emoji表情,保存時出現系統異常
java項目架構 spring-boot+mybatis+德魯伊連接池
現象
拋出 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
定位
1、數據庫字段、表、數據庫、mysql的編碼需要設置成utf8mb4
2、數據庫連接設置編碼
show variables like "%char%";
解決
1、設置數據庫
1)修改字段字符集
ALTER TABLE table_name CHANGE column_name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2)設置表的字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3)設置數據庫的字符集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
4)修改數據庫應用字符集
找到linux下的mysql位置 $ whereis mysql 找到位置 $ vi my.cnf 【這里有my.ini,如果只有my-default.ini,則復制一份並命名為my.ini】 [增加或修改] [client] # 客戶端來源數據的默認字符集 default-character-set = utf8mb4 [mysqld] # 服務端默認字符集 character-set-server=utf8mb4 # 連接層默認字符集 collation-server=utf8mb4_unicode_ci [mysql] # 數據庫默認字符集 default-character-set = utf8mb4
$ service mysqld restart 重啟服務即可
2、設置編碼
在命令行中輸入,但是這個只在當前會話起作用
set character_set_database=utf8;
set character_set_server=utf8;
3、修改連接池屬性(設置會話字符集)
<property name="connectionInitSqls"> <list> <value>set names utf8mb4</value> </list> </property>

注: set names utf8mb4; 命令會將 character_set_client、character_set_connection、character_set_results 3個會話字符集相關變量均設置為 utf8mb4,以保證寫入或者讀出的數據使用 utf8mb4 字符集進行解釋。
並且
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
特別說明其中的jdbc.url配置:如果你已經升級好了mysql-connector,其中的characterEncoding=utf8可以被自動被識別為utf8mb4(當然也兼容原來的utf8),
而autoReconnect配置我強烈建議配上,我之前就是忽略了這個屬性,導致因為緩存緣故,沒有讀取到DB最新配置,導致一直無法使用utf8mb4字符集,多么痛的領悟!!
親測可以
utf8與utf8mb4說明:
UTF- 8:Unicode Transformation Format-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24為(三個字節)來編碼。
UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。