方案1:修改數據庫編碼
為什么我們設置表的的字符類型為utf8卻不能存放emoji呢?
原來utf8可能是2或3或4個字節,而mysql的utf8是3個字節,存放一個emoji是需要4個字節的,自然不夠。
Mysql數據庫在5.5.3之后開始支持utf8mb4字符集,所以mysql版本是5.5.3+的都可以設置讓數據庫存儲Emoji表情,如果你的應用有移動端的,最好一開始設計數據庫的時候就使用utf8mb4字符集,當然沒用的也可以通過如下方式修改:
編輯mysql配置文件
vim /etc/my.cnf
添加下面代碼
[mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4
在mysql中執行以下命令修改環境變量
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;
至此數據庫的配置就完成了,在代碼連接數據庫之后還需要執行
SET names utf8mb4
這樣就可以自此 Emoji 表情了。
方案2:轉義emoji表情
如果嫌上述方案麻煩,還要操作數據庫最初的類型。那么這種方法適合你。
原理:轉義成字符串放入到數據庫,使用的時候反轉義可以直接轉義成表情,再把內容傳進去就。
//對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; }
文章參考:
讓你的網站支持 Emoji (https://segmentfault.com/a/1190000003074856)
如何讓emoji存放到數據庫中 (http://blog.csdn.net/u011957758/article/details/53074205)
版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請注明作者及出處。 |