##はじめに
Docker内のRailsで絵文字付きの文章を保存しようとしたら、めちゃ詰まったので備忘録として残しておきます。
##開発環境
ruby 2.6.2
rails 5.1.1
mysql 5.7
##手順
文字エンコーディングがutf8の場合、絵文字の保存はできないのでutf8mb4を適用するためにいくつかのファイルを編集する必要がある。
###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に以下の設定を追加。
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ファイルを作成する。
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 =utf8をCHARSET=utf8mb4に変更。
###docker-compose.ymlの編集
db:にcommand:,volumes:を追加。
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