標籤:儲存 default shu 使用 應用 tps auto except tsql
文章參考
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>
或
並且
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。
表情儲存異常--mybatis拋出異常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)