質問: PHP+MySQLでWebアプリケーションを開発しています。 スマホからの絵文字がutf8では保存できないので、utf8mb4に変更しました。これでハートや太陽などは入るようになったのですが、人の顔のような絵文字は??になります。そこで、質問があります。 * utf8mb4でも、保存できる絵文字とできない絵文字が存在するのでしょうか。 * それとも、設定に不足か間違いがあって、本来全て保存できるものでしょうか? * 保存できるものとできないものがある場合、違いは何でしょうか。見分ける方法等はありますか? ぐぐっても回答が見つからず、困っております。情報へのポインタだけでも構いませんので、何卒よろしくお願いします。 追記:環境 CentOS6.5 Apache2.2.15 PHP5.6.12 MySQL5.5.28 フレームワーク 自作 my.cnfより抜粋 ``` [mysqld] # character-set character-set-server=utf8mb4 skip-character-set-client-handshake [client] #default-character-set=utf8 [mysql] default-character-set=utf8 [mysqldump] default-character-set=utf8 ``` php.ini内に特に文字コードの設定なし ([mbstring]セクションはすべてコメントアウトされている)
回答: utf8mb4 はすべての絵文字が入ります。 「?」になってしまうということは、テーブルやカラムの charset がちゃんと utf8mb4 になっていないか、クライアントからの接続が utf8mb4 になっていないということが考えられます。 接続の charset は `SHOW VARIABLES LIKE '%char%'` クエリで確認できます。 接続の charset は接続毎に設定されるので、mysql コマンドで接続したときの charset がちゃんと utf8mb4 だったとしても、PHP アプリケーションからの接続では異なっている場合があります。 自分は PHP には詳しくないのですが、PHP アプリケーション内で MySQL 接続用の charset を指定できるパラメータがあると思いますので、それがちゃんと utf8mb4 になっているのかを確認してみるのが良いと思います。