4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

##はじめに
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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?