Help us understand the problem. What is going on with this article?

Rails5で絵文字を保存する utf8mb4 (docker)

はじめに

Docker内のRailsで絵文字付きの文章を保存しようとしたら、めちゃ詰まったので備忘録として残しておきます。

スクリーンショット 2019-05-15 16.25.02.png

開発環境

ruby 2.6.2

rails 5.1.1

mysql 5.7

手順

文字エンコーディングがutf8の場合、絵文字の保存はできないのでutf8mb4を適用するためにいくつかのファイルを編集する必要がある。

my.cnfの編集

my.cnfを以下のように編集。

my.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake
collation-server = utf8mb4_general_ci
init-connect = "SET NAMES utf8mb4"
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = 1

my.cnfを編集する場合,mysqlを再起動する必要がある。
以下のコマンドで再起動。

service mysql restart

or

systemctl restart mysql

database.ymlの編集

config/database.ymlに以下の設定を追加。

database.yml
default: &default
  adapter: mysql2
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  charset: utf8mb4 #追加
  encoding: utf8mb4 #追加
  collation: utf8mb4_general_ci #追加
...

config/initializers/utf8mb4.rbファイルの作成

create_table時にオプションを渡すため、config/initializers/にutf8mb4.rbファイルを作成する。

config/initializers/utf8mb4.rb
module Utf8mb4
  def create_table(table_name, options = {})
    table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
    super(table_name, table_options) do |td|
      yield td if block_given?
    end
  end
end

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      prepend Utf8mb4
    end
  end
end

schema.rbの編集

create_table "test", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC", force: :cascade do |t|

デフォルトのCHARSET =utf8CHARSET=utf8mb4に変更。

docker-compose.ymlの編集

db:にcommand:,volumes:を追加。

docker-compose.yml
db:
    #追加
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci  
    volumes: 
     #追加
      - /mysql/my.cnf:/etc/mysql/conf.dmy.cnf  

これで設定完了。

おわりに

ここに僕は二日かけてしまったので、どうか皆さんの参考になりますように。

参考文献

Rails5.1でutf8mb4(絵文字)に対応させる
https://qiita.com/okamu_/items/5eb81688849fbe351350
Ruby on Rails 5 + MySQL5.6でutf8mb4を使う方法
https://www.playfulit.net/articles/wRxodTN3dUF34JL97bz6HNao

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away