XoopsX / legacy

XOOPS Cube Legacy base repository
15 stars 11 forks source link

mysqlが絵文字に対応していない #77

Open kujiy opened 8 years ago

kujiy commented 8 years ago

こちらで対応していただいたコードを見て気付いたのですが、mysqlの文字コードが utf8_general_ci のようです。 これはスマホから絵文字を投稿されるとサービスが止まってしまう文字コードですので、 utf8mb4_general_ci にする必要があるかと思います。(MySQL, MariaDB

対応する場合は、ここらへん をmysqlのバージョンに合わせて書き換えればいいでしょうか。

既存システムはどうすればいいかな。変換する方法はあるようですが、こういった場合はどう対応するのがxoops流でしょうか。まずは新規システムだけでも対応したいところです。

nao-pon commented 8 years ago

あまり詳しくないので教えて下さい。 サービスが止まってしまうということは、どのようなことでしょうか?

utf8_unicode_ci なサイトでスマホから d3forum に絵文字を投稿してみたところ、絵文字だけがカットされた状態でした。

nao-pon commented 8 years ago

利用可能であれば utf8mb4 にしておけば下位互換性を保ちつつ、4バイト文字も扱えるという認識でよろしいでしょうか?

hamaco commented 8 years ago

utf8からutf8mb4にすると微妙に互換性がないので、100%問題がないかって言われるとあれな気がします。 まあ、ほぼほぼ問題ないと思いますが。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.11 以前の Unicode サポートから現在の Unicode サポートへのアップグレード

utf8_unicode_ci なサイトでスマホから d3forum に絵文字を投稿してみたところ、絵文字だけがカットされた状態でした。

ぶっちゃけどうでもよいけど、これって絵文字だけじゃなくて、絵文字以降全部カットされたような記憶が。

nao-pon commented 8 years ago

@hamaco ありがとうございます。なんかややこしそうですね。モジュールによってどのようなテーブル定義・構造にしているか分からないので、insert 時にカラム定義を見て4バイトに対応していない場合は、4バイト文字のみ除去するのがいいように思います。

メモ

$textwithout4byte = preg_replace('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', '', $textwith4byte);

ref. http://m.designbits.jp/12072410/

追記 カラム毎に照合順序を確認するのはちと大変そうなので、テーブル単位でいいかな?

追記その2 バイナリデータの場合もあるので、単純に4バイト文字除去するわけにはいきませんね。

kujiy commented 8 years ago

大変遅くなり申し訳ございません。記憶がおぼろげなんですが、何かのモジュールで投稿後真っ白になった気がします。いずれにしてもスマホファーストの時代ですので絵文字が出せないのはなんとかしたいですね。(将来的に若い開発者が入ってこなくなってしまいます)

4バイト文字のみ除去はいい方法だと思います。

できれば userテーブル のような問題もありますし、mysql側の更新については一気に移行させてしまうフローをこれを機に作って、以降の面倒を見なくてもいいようにできたらいいかもしれないですね。(最近のサービスはリリースと一緒に移行ツール自動発火が多いですし)

  1. 管理画面にmysql移行の案内文を表示
    • xupdateでも表示
  2. backup取って移行しちゃうツールを叩かせる(yes/no付き?自動発火?)
  3. 移行に問題あったらissueで報告し、みんなでなんとかしてフィードバック
  4. 次回からmysqlの変更も楽ちんに