php emoji mysql錯誤是因為資料庫不支援表情,其解決方法是:1、將字元集改為utfmb4;2、將emoji表情轉義,呼叫時再轉換回去即可。
本文操作環境:Windows7系統、PHP7.1版本、Dell G3電腦
如何解決php emoji mysql 錯誤問題?
#製作小程式時有用到把用戶微信名等資訊存到資料庫中作為一個練習記錄的參考,但是發現當微信名裡面有emoji表情時,這個表情卻無法存入資料庫欄位。之前用的時access資料庫,欄位中是可以直接存入表情的。
原因檢查:
#首先:我測試了一下是不是PHP程式的原因,使用post提交帶有emoji表情的內容,提交的內容是正常的,post裡面的內容是有emojin表情的。
接著:試著將這個資料插入資料庫裡面。成功插入資料庫後,發現表情變成了?號顯示。
到這裡問題基本上就明白了,就是我的資料庫不支援這個表情了。
注意!注意!注意:這是我用sql-front工具運行的結果,但是在PHP程式中運行,可能導致emoji表情後面所有的內容都無法正常存入。如:
【「表情」標題】emoji符號在內容最開頭,插入內容直接為空,
【前面「表情」標題】插入內容為【前面】,
emoji表情及emoji表情後面的內容全部無法正常插入。
解決方法:
方法一:查了網路上說是改變資料庫字元集編碼,試著將字元集改為了utfmb4。再插入一條數據看,確實表情被存入資料庫了。
要注意的是:但即使改了資料庫的字元集,PHP程式也要相應地變更字元集。要不然還是???。
定義方法為:mysqli_query($conn,"SET NAMES UTF8MB4");
方法二:將emoji表情轉義,呼叫時再轉換回去。無非就是定義兩個函數,一個轉義,一個反轉義。 //emoji轉義
function en_emoji($str){ $en_str=''; $length=mb_strlen($str,'utf-8'); for($i=0;$i=4){ $en_str.=''.rawurlencode($tmp_str).''; }else{ $en_str.=$tmp_str; } } return $en_str; } //反转义为emoji function de_emoji($str){ $de_str=preg_replace_callback('|(.*?)|',function($matches){ return rawurldecode($matches[1]); },$str); return $de_str; }
使用方法也很簡單,在存入資料庫時對資料進行轉義,讀取顯示時再反轉義即可。
en_emoji($str)後結果為:
#讀取顯示時使用de_emoji($str),就可以了。
兩種解決方法比較:
方法一:修改字元集,不只修改資料庫,還要修改程式碼。但怎麼說呢,可能以後資料庫都會升級為utf8mb4。
方法二:使用函數的方法,只需要修改程序,不需要動資料庫。兩個函數實現了。但是存在資料庫裡面的內容相比就是一些亂碼的感覺。而且當我在寫這篇文章時發現,因為在儲存資料時使用了en_emoji,所以所有的表情都變成了轉義後的程式碼,而當我在顯示文章內容時使用反轉義de_emoji,這個時侯我發現我文章中本來想表現的轉義後內容也被反轉義了。可以看到我上面的結果表現我只能用一張圖片代替了。
結語:還是少用emoji表情吧。反正都很麻煩,當然如果資料庫是自己做,程式也是自己寫用方法一設定utf8mb4還是比較完美的。但實話說吧,我只是在寫這篇文章時用了轉義函數,寫完就先停用了,省得給我帶來不必要的麻煩。
推薦:《PHP影片教學》
以上是如何解決php emoji mysql 錯誤問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!