爲何咱們設置表的的字符類型爲utf8卻不能存放emoji呢?
原來utf8多是2或3或4個字節,而mysql的utf8是3個字節,存放一個emoji是須要4個字節的,天然不夠。
Mysql數據庫在5.5.3以後開始支持utf8mb4字符集,因此mysql版本是5.5.3+的均可以設置讓數據庫存儲Emoji表情,若是你的應用有移動端的,最好一開始設計數據庫的時候就使用utf8mb4字符集,固然沒用的也能夠經過以下方式修改:html
編輯mysql配置文件
vim /etc/my.cnf
添加下面代碼mysql
[mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4
在mysql中執行如下命令修改環境變量sql
set character_set_client = utf8mb4; set character_set_connection = utf8mb4; set character_set_database = utf8mb4; set character_set_results = utf8mb4; set character_set_server = utf8mb4;
查看是否修改爲功,執行以下sql語句
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';數據庫
修改已經創建表的字符集
alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;
至此數據庫的配置就完成了,在代碼鏈接數據庫以後還須要執行vim
SET names utf8mb4
這樣就能夠自此 Emoji 表情了。segmentfault
若是嫌上述方案麻煩,還要操做數據庫最初的類型。那麼這種方法適合你。網站
原理:轉義成字符串放入到數據庫,使用的時候反轉義能夠直接轉義成表情,再把內容傳進去就。編碼
//對emoji表情轉義 function emoji_encode($str){ $strEncode = ''; $length = mb_strlen($str,'utf-8'); for ($i=0; $i < $length; $i++) { $_tmpStr = mb_substr($str,$i,1,'utf-8'); if(strlen($_tmpStr) >= 4){ $strEncode .= '[[EMOJI:'.rawurlencode($_tmpStr).']]'; }else{ $strEncode .= $_tmpStr; } } return $strEncode; } //對emoji表情轉反義 function emoji_decode($str){ $strDecode = preg_replace_callback('|\[\[EMOJI:(.*?)\]\]|', function($matches){ return rawurldecode($matches[1]); }, $str); return $strDecode; }
文章參考:url
讓你的網站支持 Emoji (https://segmentfault.com/a/1190000003074856)
如何讓emoji存放到數據庫中 (http://blog.csdn.net/u011957758/article/details/53074205)spa
版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請註明做者及出處。 |