2018-10-16

emoji 文字存進 mysql (mariadb) 中變問號(????)!!!!

現在手邊的這個案子真的讓我碰到不少以前顯少會想到或遇到的小麻煩,麻煩不大,但很碎。

不過會這樣碎,大概也跟我自己亂弄有關吧…

----
回正題

這次遇到的狀況是

「我用 ckeditor 在建立訊息,訊息中用了 emoji speech-ballon (💬) 符號,然後透過 php 將訊息存入 mysql 中,存好後撈出資料放在網頁上,遇到該 emoji 符號變 ???? ,四個問號;檢查資料庫中該符號的狀態,也確實是 ???? 四個問號,但並不是每一個 emoji 符號都是四個問號,也有正常顯示的。」

分析:

  1. 使用 ckeditor
  2. emoji
  3. mysql
debug:
  1. ckeditor 我用的只是單純屬前端的版本,網頁 html, php, mysql 我都有確認都有用 utf8 charset ,而且 emoji 符號在 ckeditor 的編輯區中是正常顯示的,所以 ckeditor 應該是沒問題的。
  2. emoji 本身只要你用的瀏覽器不要太舊,基本都內建,而因為 emoji 是 unicode ,所以網頁最好是用 utf8 ,而這點我確認是 ok 的,而且並不是每個 emoji 都異常。
  3. mysql 我內部設定是使用 utf8mb4 ,db, table 的編碼和 table 有中文的欄位編碼我都是設定 utf8mb4 ,但我 php pdo connection 是設定「charset=utf8」,我在「」看到了版主說明了 utf8 不一定都是 3 bytes ,也有 4 bytes 的,而 mysql 的 utf8mb4 就是支援到了 4 bytes ,然後我在「」查到 💬 是 4bytes ;所以,問題找到了,是我做 php pdo connection 使用 charset=utf8 的關係,雖然大部份的資料寫入資料庫跟從資料庫讀出都沒啥狀況,但遇到 utf8 4bytes 就會有異常, php 處理過程沒有報錯,但資料確實是 utf8 4bytes 塞不進 utf8 3bytes 的 connection 中…所以將 php pdo connection charset 改為 utf8mb4 後,一切都正常了。
總結:
是我懶,用 utf8mb4 是想用新的編碼也是想說可以避過一些文字上的問題,結果,最後的原因還是自己忘了把一切的 connection 改 utf8mb4 ,害自己找資料翻過頭。

沒有留言: