Twitter API を使って Tweet を MySQL のデータベースへ保存する際にエラーが出てしまいました。
Incorrect string value: '\xF0\x9F\x...
エラーを検索するとすぐに解決方法が出ます。
mysql - java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...' - Stack Overflow
詰まるところ、iPhone などの絵文字がデータベースに保存できなくてエラーが出てしまっていました。
iOS絵文字一覧 より
絵文字は文字セット utf8mb4(4バイト文字)で表現されており、データベースの文字セットが utf8 などだとこれを保存できないというわけです。
MySQL なら Version 5.5 以降で utf8mb4 に対応したとのことです。サーバーのファイルを弄る権限を持っていれば、MySQL だと設定ファイルを下のようにすれば簡単に utf8mb4 へ変更できます。
[mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4
既に作ってあるデータベースやテーブルの文字セットを変更するには、
MySQLに絵文字を格納するにはutf8mb4を使う必要があった - F.Ko-Jiの「一秒後は未来」
- 「alter database データベース名 default character set utf8mb4;」でデータベースの文字コードを変更
- 「alter table テーブル名 default character set utf8mb4;」でテーブルの文字コードを変更
- 「alter table テーブル名 modify カラム名 ... character set utf8mb4 ...」でカラムの文字コードを変更
とのこと。
これができる場合は良いのですが、レンタルサーバーを借りている時が困りものですね。現在私は「ファイアバード」というレンタルサーバーを借りているのですが、MySQL のバージョンをチェックしたら 5.0.9 でした…。5.5 が遠い…。
Wordpress の推奨環境が utf8mb4 に
この件を検索していて知ったのですが、Wordpress 4.x を使う際のデータベースは文字セットに utf8mb4 を推奨しているようです。utf8mb4 を使えないサーバーの場合は utf8 を使う設定に切り替わります。
最近ではスマートフォンやタブレットから Wordpress のサイトを更新する人もいるでしょうし、そうなると絵文字を使うかもしれません。時代の流れに併せて Wordpress の推奨環境もよりたくさんの表現ができる文字セットに切り替わっているのです。
utf8 の Wordpress で絵文字を使うとこれを保存・表示できるように自動的にうまく置き換えてくれるようなので問題は無いのですが、時代の流れは utf8mb4 なのでしょう。それに utf8mb4 だと難しい漢字や珍しい人名漢字も使えるようになります。
というわけで、レンタルサーバーは utf8mb4 が使えるように MySQL 5.5 以降にアップデートしてもらいたいところです。「さくらのレンタルサーバー」は既に MySQL 5.5 になっているようです。
そろそろレンタルサーバーの契約が切れるので「さくら」に切り替えようか、それとも何か他の VPS にしようかと悩み中です。