最近在研發(fā)過程中,發(fā)現(xiàn)前端傳遞的表情符號無法存入到mysql表中渺鹦。查詢了下扰法,發(fā)現(xiàn)mysql需要使用utf8mb4進行編碼。
為了搞清楚其中的原因毅厚,特意找到了這篇文章∪洌現(xiàn)在將文章主要內(nèi)容記錄下來,有興趣的還是去看看原文吸耿。
核心:如果要支持unicode祠锣,那么記得使用utf8mb4,不要用utf8
UTF-8編碼
utf-8編碼采用可變的1到4個字節(jié)來進行字符的編碼(U+00000 ~ U+10FFFF)。比如ASCII字符只用一個字節(jié)(8bit)來進行表示咽安,而漢字需要2到3個字節(jié)來表示伴网。utf-8能夠表示1114112個字符(大概一百多萬個字符)
MySQL中的utf8字段
Mysql中的utf8只能存儲具有1到3個字節(jié)的unicode字符,對于需要4個字節(jié)編碼的unicode字符無法支持妆棒。比如將emoji表情(4個字節(jié))存入到utf8字段下澡腾,是會失敗的。同時原文中提到會有安全問題糕珊。
Mysql中的utf8mb4字段
MySQL5.5.3(2010年發(fā)布)中引入了一種新的編碼utf8mb4动分。能夠完全支持utf8編碼,既對于4字節(jié)的unicode字符也能完全存儲放接。
修改mysql數(shù)據(jù)庫編碼格式
mysql中可以分別指定數(shù)據(jù)庫刺啦,表以及表中字段的編碼格式。
修改數(shù)據(jù)庫編碼格式
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
注:COLLATE表示排序規(guī)則纠脾,集中常用的排序介紹
- utf8mb4_unicode_ci: 基于標(biāo)準(zhǔn)unicode進行排序玛瘸,在各種語言之間精確排序蜕青;
- utf8mb4_general_ci: 沒有實現(xiàn)unicode排序規(guī)則,遇到特殊語言或字符集糊渊,排序結(jié)果可能不一致右核;性能會更快一些
- utf8mb4_bin:區(qū)分大小寫。mysql中默認(rèn)不區(qū)分大小寫
然而平常開發(fā)過程中不要特別關(guān)注排序規(guī)則渺绒,但是要保證編碼格式和排序規(guī)則要統(tǒng)一贺喝。
總結(jié):使用utf8mb4,不要使用utf8