前兩天負責的系統,因為需要擷取使用者的昵稱并進行入庫,但是有個别使用者的昵稱中存在emoji表情,導緻入庫時報錯。
報錯内容:
<code>java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94‘ for column</code>
Q:為什麼我們設定表的的字元類型為utf8卻不能存放emoji呢?
A:因為我們UTF-8編碼可能是2或3或4個位元組,但mysql中的utf8是3個位元組,存放一個emoji是需要4個位元組的,自然不夠。
Mysql資料庫在5.5.3之後開始支援utf8mb4字元集,是以mysql版本是5.5.3+的都可以設定讓資料庫存儲Emoji表情
是以如果你的應用有移動端的,最好一開始設計資料庫的時候就使用utf8mb4字元集
方案一: 過濾字元串中的emoji
方案二: 轉譯emoji後入庫。擷取時反轉譯成emoji使用
另外再推薦一款emoji轉義工具
注意點:emoji轉譯後可以入庫。但當使用者就是輸入的内容本身就是【轉譯後的内容】
此時從庫中反轉譯時就變成了emoji。這就造成跟使用者輸入不一緻的情況
方案三: 修改資料庫配置,實作可存儲emoji
目前網上給的解決方案普遍都是:修改該字段或者該張表的編碼方式為utf8mb4
但僅這麼處理是并不起作用。
還需要執行<code>SET NAMES utf8mb4;</code> 将整個庫的 character_set_client、character_set_connection、character_set_results等值修改為utf8mb4才會起作用
修改已經建立表的字元集<code>alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;</code>
注意點:建立資料庫時可以進行初始化設定,但是已有的線上生産庫進行此操作有風險,是以建議使用相關類庫轉義後進行存儲和顯示
使用下列SQL語句可以檢視MySQL中character_set相關變量:
<code>SHOW VARIABLES LIKE '%char%';</code>
------The End------
感謝大家看到最後,文章持續更新!歡迎大家指出我的文章的不足之處,也歡迎大家關注、收藏+分享
如果這個辦法對您有用,或者您希望持續關注,也可以掃描下方二維碼或者在微信公衆号中搜尋【碼路無涯】
