天天看點

資料中有emoji,導緻插入不了資料庫

前兩天負責的系統,因為需要擷取使用者的昵稱并進行入庫,但是有個别使用者的昵稱中存在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------

感謝大家看到最後,文章持續更新!歡迎大家指出我的文章的不足之處,也歡迎大家關注、收藏+分享

如果這個辦法對您有用,或者您希望持續關注,也可以掃描下方二維碼或者在微信公衆号中搜尋【碼路無涯】

資料中有emoji,導緻插入不了資料庫