emoji是啥?
下面是摘自維基百科的一段解釋:
繪文字(英語:emoji,日語:絵文字/えもじ emoji)是使用在網頁和聊天中的形意符號,最初是日本在無線通信中所使用的視覺情感符號(圖畫文字)。繪意指圖形,文字則是圖形的隱喻,可用來代表多種表情,如笑臉表示笑、蛋糕表示食物等。在中國大陸,繪文字通常叫做“小黃臉”,或者叫emoji。
太抽象?其實emoji就是我們使用了多年的QQ、微信裡的表情符號。
emoji引發的問題
emoji給我們帶來了傳圖達意的便捷,但是卻令開發者很頭疼,插入數據庫報錯:Incorrect string value: \\xF0\\x9F\\x98\\x84\\xF0\\x9F
項目中有一部分要與微信打交道,需要獲取掃碼用戶的暱稱信息,而有些用戶暱稱裡含有表情符號,當插入mysql數據庫時,就報出了Incorrect string value的錯誤。
錯誤原因
mysql數據庫默認採用了utf8字符集,utf8字符集最多支持三個字節,而emoji佔用4個字節的存儲空間,所以在存入數據庫時,就引發了錯誤。
自從mysql 5.5.3版本後,有了一種每個字符使用4個字節的字符集utf8mb4,utf8mb4是utf8的一個超集,兼容utf8,所以將字符集由utf8轉為utf8mb4即可解決這個問題。
解決方案
1. 修改mysql配置文件my.cnf(windows server的話,修改my.ini),增加以下設置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
2. 按需修改數據庫、表、字段的字符集
-- 修改數據庫字符集
ALTER DATABASE databaseName CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
-- 修改表字符集
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 修改列字符集
ALTER TABLE tableName CHANGE columnName VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
3. 改動後重啟mysql數據庫即可
注意:
如果你使用的是雲數據庫,那麼會有稍許區別,以騰訊云為例:找到MySQL數據庫,在實例列表,參數設置部分,找到character_set_server參數,默認是latin1,點擊修改,將其改動為utf8mb4,改動完保存後,會自動重啟mysql數據庫以使修改生效。重啟完成後,通過客戶端連接,改動相應的表或者數據庫字段為utf8mb4即可。
總結
由於mysql 5.5.3版本才增加了utf8mb4字符集,如果低於該版本,需要先進行升級,並評估是否影響已有生產環境。
在項目之初選擇mysql服務器時,應根據項目需要提前規劃mysql的版本以及字符集,如果有需要,提前將其設置為utfmb4字符集。
雲服務器將這些參數全部界面化了,如果通過命令行改動不了(沒有權限等錯誤),就考慮到應該在界面上進行操作,而不要一個勁的去排查為啥沒有權限。
閱讀更多 京京肚肚擼代碼 的文章