Emoji,這些可以表達情感的小卡通圖像已經成爲現代交流中不可或缺的一部分,以致於emoji這一單詞已經在2015年被正式收入韋氏詞典和牛津詞典。說到emoji的誕生,這裏還有一個頗有趣的小故事:
1999年先後,日本一個名叫慄田穰崇的年輕人,和許多直男同樣, 給女朋友發的短信常常會被誤解。好比,「知道了」被解讀成「生氣了」、「不耐煩了」,隨後引起冷戰。 因而少年慄田想:「若是能在文字裏插入一些表情符號來表達感情,你們應該會須要吧!」
原始的Emoji就這麼誕生了
emoji 愈來愈流行,一個emoji 表情,有時賽過千言萬語。尤爲在移動端,不少用戶喜歡把emoji 表情作爲本身用戶名稱的一部分,例如微信中,就有不少朋友的用戶名是這樣的,以下:java
這確實很好看,但這卻給咱們的應用程序帶來了必定的問題。目前咱們就碰到了一個由於用戶名稱中帶有emoji 表情,致使數據沒法存儲的狀況。
事情是這樣的,咱們的系統使用的數據庫是MySQL,版本是5.5.31,最近咱們發現咱們的程序有很多報錯,報錯顯示是有一些用戶的數據沒法保存,經過對報錯日誌分析,最終定位到是由於用戶名中帶有emoji 表情,致使數據存儲失敗。爲何會會數據會保存不了emoji表情呢?這裏就牽涉到一個emoji的編碼問題。mysql
Emoji字符是Unicode字符集中一部分.
常見的Emoji表情符號在Unicode字符集中的範圍和具體的字節映射關係, 能夠在Emoji Unicode Tables中查看到.
有意思的是, 該表中還給出了同一個Emoji表情在不一樣系統或應用中的字體(是字體沒錯, Emoji的樣式可經過字體文件改變)。sql
關於Emoji的最權威資料, 能夠在Unicode® Emoji Charts上查閱到.
咱們的MySQL是使用的utf8編碼,可是由於UTF-8編碼有多是兩個、三個、四個字節,其中Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,因此致使了數據插不進去。因此爲了讓MySQL支持emoji表情的存儲,必需要使用utf8mb4 編碼。
utf8mb4做爲utf8的super set,徹底向下兼容,因此不用擔憂字符的兼容性問題。切換中須要顧慮的主要影響是mysql須要從新啓動。數據庫
在升級前須要肯定幾件事情:
一、MySQL的版本。MySQL的版本必須爲5.5.3以上的版本,若是不是須要先升級MySQL,由於以前的版本不支持utf8mb4
二、若是你用的是java服務器,升級或確保你的mysql connector版本高於5.1.13,不然仍然沒法使用utf8mb4 。其它語言的暫不清楚。服務器
mysql 修改的操做步驟須要修改如下幾個地方:
一、修改mysql配置文件my.cnf
my.cnf通常在/etc/mysql/my.cnf位置。找到後請在如下三部分裏添加以下內容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'微信
二、修改database、table字符集。參考如下語句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;字體
三、重啓mysql編碼
四、檢查字符集日誌
character_set_system 的值是utf8沒有關係,並且這個值不能改成utf8mb4,不然mysql 會啓動不了。code
好了,到此,數據就能夠支持存儲emoji 表情數據了。
總結:一、因爲目前移動互聯網發展迅猛,而且emoji 愈來愈流行,因此爲了不在業務使用中升級MySQL字符集,最好是在部署MySQL的時候,就默認設置MySQL 支持 utf8mb4,由於utf8mb4是utf8的超集,是向下兼容,因此也不會影響utf8字符集的使用。二、程序開發的時候,建庫建表語句最好也指定庫表的字符爲 utf8mb4。三、若是是已經在線的業務,而又不能重啓MySQL的狀況下,也能夠經過應用層面轉換emoji等特殊字符,以達到原數據兼容,在獲取的時候,能夠加一個標籤註明,是否使用了emoji,這樣取數據時,就再作轉換就可。