fkm_y' log

技術や日常のログ

MySQLの絵文字対応

過去にMySQLの絵文字対応をしようとしたときのメモ 追記:実対応は社内の事情もあり未実施

背景

  • GoogleSearchConsoleAPIを使ってキーワード、クリック数、CTRなどの情報を取得してDBへ保存しようとしたところ以下のエラーが発生した。 ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: '\xF0\x9F\x92\x95\xE6\x84...' for column 'query'
  • エラーはキーワードに絵文字(ex:💕)が含まれていたことが原因

課題

  • MySQLへ保存するには utf8mb4 へ対応させる必要があった
  • 当時のMySQLのversion は 5.6.21
    • UTF8MB4対応は5.5以降からなので大丈夫
    • charset
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へ変更

collation変更の結論

  • utf8mb4_binに変更する
    • ひら/カタと絵文字は区別してほしいため
  • 選択肢
    • utf8mb4_bin
      • 全角/半角は区別する
      • 大文字/小文字は区別する
      • 絵文字は区別する
      • ひらがな、カタカナ区別する
    • utf8mb4_general_ci
      • 全角/半角は区別する
      • 大文字/小文字は区別しない
      • 絵文字は区別しない
      • ひらがな、カタカナ区別する
    • utf8mb4_unicode_ci
      • 全角/半角は区別しない
      • 大文字/小文字は区別しない
      • 絵文字は区別しない
      • ひらがな、カタカナ区別しない
    • utf8mb4_general_520_ci
      • 全角/半角は区別しない
      • 大文字/小文字は区別しない
      • 絵文字は区別する
      • ひらがな、カタカナ区別しない
  • https://www.slideshare.net/tmtm/mysql-2017

参考