MySQLの絵文字対応
過去にMySQLの絵文字対応をしようとしたときのメモ 追記:実対応は社内の事情もあり未実施
背景
- GoogleSearchConsoleAPIを使ってキーワード、クリック数、CTRなどの情報を取得してDBへ保存しようとしたところ以下のエラーが発生した。
ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: '\xF0\x9F\x92\x95\xE6\x84...' for column 'query'
- エラーはキーワードに絵文字(ex:💕)が含まれていたことが原因
課題
mysql> show variables like ‘%char%’; +—————————————+——————————————+ | Variable_name | Value | +—————————————+——————————————+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +—————————————+——————————————+
- 当時の設定
adapter: mysql2 encoding: utf8 collation: utf8_general_ci
対応案
- サーバーとクライアントの両方のCHARSETを
utf8mb4
へ変更- 新規作成するテーブルのみ変更する
- 今回新規作成テーブルCharsetのcharsetをutf8mb4へ
- Railsのdatabase.ymlをutf8mb4へ変更
- すべての設定を変更する
- 新規作成するテーブルのみ変更する
collation変更の結論
- utf8mb4_binに変更する
- ひら/カタと絵文字は区別してほしいため
- 選択肢
- utf8mb4_bin
- 全角/半角は区別する
- 大文字/小文字は区別する
- 絵文字は区別する
- ひらがな、カタカナ区別する
- utf8mb4_general_ci
- 全角/半角は区別する
- 大文字/小文字は区別しない
- 絵文字は区別しない
- ひらがな、カタカナ区別する
- utf8mb4_unicode_ci
- 全角/半角は区別しない
- 大文字/小文字は区別しない
- 絵文字は区別しない
- ひらがな、カタカナ区別しない
- utf8mb4_general_520_ci
- 全角/半角は区別しない
- 大文字/小文字は区別しない
- 絵文字は区別する
- ひらがな、カタカナ区別しない
- utf8mb4_bin
- https://www.slideshare.net/tmtm/mysql-2017