不知道為什么深秋的到來,讓人變的有些許抑郁和不安
🏆前言
這篇應該算個小知識吧。平時習慣在寫文章的時候都喜歡用 windows
的emoji
表情(win+.)即可彈出,就如👨💻🏂🛌🛀🤽♂️⛹️♂️🤸♂️,還有、🏎🚠🛫💺🚀🛰⛵,這種🍟🍔🍿🌭🥞🥙🍰🥤🍸
之前開發的項目,沒有存儲過這種小表情,都是使用mysql的默認字符設置UTF-8,但是今天測試發現是行不通,然后就有了這篇小文章,希望能夠讓你有所收獲。
📚一、UTF-8 為什么不支持Emoji表情
在一個utf-8表中所做測試,不支持插入數據中包含emoji表情的數據。
原因:MySQL數據庫的 “utf8”並不是真正概念里的 UTF-8。目前可見字符集都只需要3個字節,包含了所有字符。但是問題出在unicode6系列編碼上,它們需要4個字節,這部分就是有名的emoji。所以,如果我們的數據庫使用默認字符設置,是無法存儲emoji表情的。
📑二、UTF-8 與 UTF-8MB4 的區別
2.1、UTF-8 (Unicode)
我們先談談UTF-8,最早只有127個字符被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,但是要處理中文顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進去。你可以想得到的是,全世界有上百種語言,日本把日文編到Shift_JIS里,韓國把韓文編到Euc-kr里,各國有各國的標准,就會不可避免地出現沖突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。現代操作系統和大多數編程語言都直接支持Unicode。
📦
所以在UTF-8編碼中,一個英文字符占用一個字節的存儲空間,一個中文(含繁體)占用三個字節的存儲空間。
📊
目前基本上可見字符集都只需要三個字節,包含了所有字符,但是目前問題出在了unicode6系列編碼上,它們需要4個字節,這部分就是有名的emoji。所以,你只要不是特種編碼還是unicode,且不存emoji,保證不出問題。
另外在此處,我有一點需要補充的是:
MySQL數據庫的 “utf8”並不是真正概念里的 UTF-8,原因上面是一點,還有一點是MySQL中的“utf8”編碼只支持最大3字節每字符。真正的大家正在使用的UTF-8編碼是應該能支持4字節每個字符。
但其實MYSQL的開發者,並沒有修飾這個bug,而是推出了新的字符集,就是UTF-8MB4字符編碼。如👇
2.2、UTF-8MB4
UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。因此可以用來存儲emoji表情。
從8.0后,MySQL也將會在某個版本中開始使用UTF-8MB4作為默認的字符編碼。
所以簡單說即是:UTF-8MB4才是MySQL中真正的UTF-8編碼。
那么如何讓MySQL存儲Emoji表情勒。
📰三、如何讓MySQL存儲Emoji表情
我們在創建數據庫的時候,就需要選定utf-8mb4字符集,而不是utf-8。
我們在設置字段字符集的時候,也需要設置為utf-8mb4字符集。
這樣我在Navicat 中測試是可以的。
但是,我之前在網上查詢相關資料的時候,說是需要修改一下my.ini
配置文件,
在[mysqld]
下面添加:character_set_server=utf8mb4
,保存,重啟mysql,應該就可以解決了。
⌛四、自言自語
注意
:下次再有人問起設置什么樣的編碼,記得直接推薦設置utf-8mb4哦,這個才是MySQL真正的UTF-8編碼哦。
開始想11月更文寫什么,掘金大佬們,你說我現在開始學前端還有救嗎。
大家也可以說說想看什么,我會就寫寫會,不會就去學學,給大家推推文。👨💻
咱們后端這階段真的是處於一個是人是鬼都在卷的時期,困難重重啊
。
大家好,我是博主
寧在春
:主頁一名喜歡文藝卻踏上編程這條道路的小青年。
希望:
我們,待別日相見時,都已有所成
。
參考: