表情存儲異常--mybatis拋出異常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)


文章參考 

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。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM