PHP如何处理emoji表情存入utf8的数据库
生活随笔
收集整理的這篇文章主要介紹了
PHP如何处理emoji表情存入utf8的数据库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般Mysql表設計時,都是用UTF8字符集的。把帶有emoji的昵稱字段往里面insert一下就沒了,整個字段變成了空字符串。這是怎么回事呢?原來是因為Mysql的utf8字符集是3字節的,而emoji是4字節,這樣整個昵稱就無法存儲了。這要怎么辦呢
1、使用utf8mb4字符集
1、mysql的版本必須為v5.5.3或更高2、把數據庫的編碼改成utf8mb4 -- UTF-8 Unicode3、然后需要存儲emoji表情的字段選擇utf8mb4_general_ci4、數據庫連接也需要改為utf8mb4這種方式可能帶來的問題:存儲:在數據表中,對于變長的字段(如VARCHAR2,TEXT),utf8mb4最大可存儲的字符可能少于utf8系列的collation;
在索引中,對于文本類型的字段,utf8mb4可索引的字符少于utf8系列的collations。如InnoDB的索引最多使用767字節。
如果使用utf8mb4,每一個字符都會預留4字節做索引,而utf8則預留3字節。故此前者是191個字符,后者是255個字符。性能:由于以上原因,加上字符集大,utf8mb4的性能可能比utf8系列的collations低,
可以參考stackoverfolow上的一個測試結果:http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci,
差異不是特別大。運維:如果一個大的環境內,如果其他的數據庫都是utf8模式,把其中某個庫設置為utf8mb4模式,在后續交接運維可能會造成問題,遺留下坑。上下游:數據庫支持unicode的emoji存儲,上下游不一定支持。比如mysql客戶端驅動(低版本的jdbc就不行)可能不支持utf8mb4,或者DDL的中間件不支持utf8mb4。
web端處理utf8mb4字符展示,這些都有可能影響emoji的存儲活著展示。 2、使用base64編碼
這種方法是可以,但是舊數據如果沒有經過encode操作,取數據的時候如果統一進行decode的話,舊數據會丟失的。
3、過濾emoji表情
支持emoji表情是個麻煩的東西,有時即使能存儲,也不一定能完美顯示。可能會出現因emoji圖片不夠全而出現無法顯示的情況。并且有些客戶端可能還需要使用第三方類庫,需要大量的emoji圖片等。
因此,如果emoji不是非要不可,我們可以把帶有emoji內容的數據過濾掉,達到不影響其他數據的存儲。
// 過濾掉emoji表情 function filterEmoji($str) {$str = preg_replace_callback('/./u',function (array $match) {return strlen($match[0]) >= 4 ? '' : $match[0];},$str);return $str; }
1、mysql的版本必須為v5.5.3或更高2、把數據庫的編碼改成utf8mb4 -- UTF-8 Unicode3、然后需要存儲emoji表情的字段選擇utf8mb4_general_ci4、數據庫連接也需要改為utf8mb4這種方式可能帶來的問題:存儲:在數據表中,對于變長的字段(如VARCHAR2,TEXT),utf8mb4最大可存儲的字符可能少于utf8系列的collation;
在索引中,對于文本類型的字段,utf8mb4可索引的字符少于utf8系列的collations。如InnoDB的索引最多使用767字節。
如果使用utf8mb4,每一個字符都會預留4字節做索引,而utf8則預留3字節。故此前者是191個字符,后者是255個字符。性能:由于以上原因,加上字符集大,utf8mb4的性能可能比utf8系列的collations低,
可以參考stackoverfolow上的一個測試結果:http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci,
差異不是特別大。運維:如果一個大的環境內,如果其他的數據庫都是utf8模式,把其中某個庫設置為utf8mb4模式,在后續交接運維可能會造成問題,遺留下坑。上下游:數據庫支持unicode的emoji存儲,上下游不一定支持。比如mysql客戶端驅動(低版本的jdbc就不行)可能不支持utf8mb4,或者DDL的中間件不支持utf8mb4。
web端處理utf8mb4字符展示,這些都有可能影響emoji的存儲活著展示。 2、使用base64編碼
這種方法是可以,但是舊數據如果沒有經過encode操作,取數據的時候如果統一進行decode的話,舊數據會丟失的。
3、過濾emoji表情
支持emoji表情是個麻煩的東西,有時即使能存儲,也不一定能完美顯示。可能會出現因emoji圖片不夠全而出現無法顯示的情況。并且有些客戶端可能還需要使用第三方類庫,需要大量的emoji圖片等。
因此,如果emoji不是非要不可,我們可以把帶有emoji內容的數據過濾掉,達到不影響其他數據的存儲。
// 過濾掉emoji表情 function filterEmoji($str) {$str = preg_replace_callback('/./u',function (array $match) {return strlen($match[0]) >= 4 ? '' : $match[0];},$str);return $str; }
4、文本轉義emoji表情 /** 把用戶輸入的文本轉義(主要針對特殊符號和emoji表情) */ public function userTextEncode($str){if (!is_string($str)) return $str;if (!$str || $str=='undefined') return '';$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); }/** 解碼上面的轉義 */ public function userTextDecode($str){$text = json_encode($str); //暴露出unicode$text = preg_replace_callback('/\\\\\\\\/i',function($str){return '\\';},$text); //將兩條斜杠變成一條,其他不動return json_decode($text); }
*推薦使用文本轉義emoji表情
?
?
轉載于:https://www.cnblogs.com/qhorse/p/10601433.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的PHP如何处理emoji表情存入utf8的数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能调优之sar
- 下一篇: PHP7添加opcache.so模块