最終解決方式:更換字元集utf8-->utf8mb4 上周有開發人員反饋一個問題:前臺應用抓取微博信息,每天總有幾條數據插入不成功。應用日誌顯示: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xAA",...' for c ...
最終解決方式:更換字元集utf8-->utf8mb4
上周有開發人員反饋一個問題:前臺應用抓取微博信息,每天總有幾條數據插入不成功。應用日誌顯示: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xAA",...' for column 'raw_json' at row 1, 異常:org.springframework.jdbc.UncategorizedSQLException: 其中raw_json欄位顯示如下:
由上圖可知,插入的欄位裡面包含emoji表情符。基本可以判定是字元編碼的問題。我們的資料庫裡面使用的是utf8編碼,普通的字元串或者表情都是占位3個位元組,所以utf8足夠用了,但是移動端的表情符號占位是4個位元組,普通的utf8就不夠用了,為了應對無線互聯網的機遇和挑戰、避免 emoji 表情符號帶來的問題、涉及無線相關的 MySQL 資料庫建議都提前採用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。
既然找到了原因就來執行吧.既然只有raw_json列含表情符,就先修改此列的字元集: ALTER TABLE xx_pnl_weibo_usershow MODIFY ` raw_json` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; 改完後測試,插入失敗。 修改表的字元集: alter table xx_pnl_weibo_usershow CHARSET=utf8mb4 ; 改完後測試,插入失敗。 修改庫級別的字元集 vi /etc/my.cnf [client] default-character-set=utf8mb4 [mysqld] character-set-server = utf8mb4 service mysqld restart 改完後測試,插入成功。 emoji表情編碼參考:
http://punchdrunker.github.io/iOSEmoji/table_html/flower.html
因為是線上生產業務,需要先在測試環境做好測試工作。避免業務高峰期,線上申請停機視窗操作。