PHP如何處理emoji表情存入utf8的數據庫


一般Mysql表設計時,都是用UTF8字符集的。把帶有emoji的昵稱字段往里面insert一下就沒了,整個字段變成了空字符串。這是怎么回事呢?

原來是因為Mysql的utf8字符集是3字節的,而emoji是4字節,這樣整個昵稱就無法存儲了。這要怎么辦呢


 1、使用utf8mb4字符集
1、mysql的版本必須為v5.5.3或更高 2、把數據庫的編碼改成utf8mb4 -- UTF-8 Unicode 3、然后需要存儲emoji表情的字段選擇utf8mb4_general_ci 4、數據庫連接也需要改為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表情

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM