Open kujiy opened 8 years ago
あまり詳しくないので教えて下さい。 サービスが止まってしまうということは、どのようなことでしょうか?
utf8_unicode_ci なサイトでスマホから d3forum に絵文字を投稿してみたところ、絵文字だけがカットされた状態でした。
利用可能であれば utf8mb4 にしておけば下位互換性を保ちつつ、4バイト文字も扱えるという認識でよろしいでしょうか?
utf8からutf8mb4にすると微妙に互換性がないので、100%問題がないかって言われるとあれな気がします。 まあ、ほぼほぼ問題ないと思いますが。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.11 以前の Unicode サポートから現在の Unicode サポートへのアップグレード
utf8_unicode_ci なサイトでスマホから d3forum に絵文字を投稿してみたところ、絵文字だけがカットされた状態でした。
ぶっちゃけどうでもよいけど、これって絵文字だけじゃなくて、絵文字以降全部カットされたような記憶が。
@hamaco ありがとうございます。なんかややこしそうですね。モジュールによってどのようなテーブル定義・構造にしているか分からないので、insert 時にカラム定義を見て4バイトに対応していない場合は、4バイト文字のみ除去するのがいいように思います。
メモ
$textwithout4byte = preg_replace('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', '', $textwith4byte);
ref. http://m.designbits.jp/12072410/
追記 カラム毎に照合順序を確認するのはちと大変そうなので、テーブル単位でいいかな?
追記その2 バイナリデータの場合もあるので、単純に4バイト文字除去するわけにはいきませんね。
大変遅くなり申し訳ございません。記憶がおぼろげなんですが、何かのモジュールで投稿後真っ白になった気がします。いずれにしてもスマホファーストの時代ですので絵文字が出せないのはなんとかしたいですね。(将来的に若い開発者が入ってこなくなってしまいます)
4バイト文字のみ除去はいい方法だと思います。
できれば userテーブル のような問題もありますし、mysql側の更新については一気に移行させてしまうフローをこれを機に作って、以降の面倒を見なくてもいいようにできたらいいかもしれないですね。(最近のサービスはリリースと一緒に移行ツール自動発火が多いですし)
こちらで対応していただいたコードを見て気付いたのですが、mysqlの文字コードが
utf8_general_ci
のようです。 これはスマホから絵文字を投稿されるとサービスが止まってしまう文字コードですので、utf8mb4_general_ci
にする必要があるかと思います。(MySQL, MariaDB)対応する場合は、ここらへん をmysqlのバージョンに合わせて書き換えればいいでしょうか。
既存システムはどうすればいいかな。変換する方法はあるようですが、こういった場合はどう対応するのがxoops流でしょうか。まずは新規システムだけでも対応したいところです。