背景mysql
作微信開發的時候發現,微信支持emoji表情作暱稱,結果考慮不周sql
Mysql表設計時,都是用UTF8字符集的。把帶有emoji的暱稱字段往裏面insert一下就沒了,整個字段變成了空字符串。有的根本插入是失敗,原來是由於Mysql的utf8字符集是3字節的,而emoji是4字節,這樣整個暱稱就沒法存儲了。json
這要怎麼辦呢?微信
第一種方案:微信開發
若是你已經有不少數據了就不要修改字符集了由於會形成亂碼狀況你能夠幹掉他或者表情替換成***編輯器
$result['nickname'] = preg_replace('/\\\u[a-z0-9]{4}/', '*', userTextEncode($result['nickname']));性能
function userTextEncode($str){測試
if(!is_string($str))return $str;編碼
if(!$str || $str=='undefined')return '';spa
$text = json_encode($str); //暴露出unicode
$text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i",function($str){
return addslashes($str[0]);
},$text); //將emoji的unicode留下,其餘不動,這裏的正則比原答案增長了d,由於我發現我不少emoji其實是\ud開頭的,反而暫時沒發現有\ue開頭。
return json_decode($text);
}
第二種方案:
若是你還在測試階段並無真正產品數據就果斷轉化mysql字符集爲:utf8mb4字符集,可是要求你的mysql版本>=5.5.3,你大可直接將utf8直接升級爲utf8mb4字符集
這種4字節的utf8編碼可完美兼容舊的3字節utf8字符集,而且能夠直接存儲emoji表情,是最好的解決方案,至於字節增大帶來的性能損耗,能夠忽略不計。
以上方案就可解決PHP微信暱稱或一些富文本編輯器中的表情問題,但願你們喜歡。