werckerでmysqlのutf8mb4を使う方法が分かったのでまとめておく。
参考にしたページ
- MySQL :: MySQL 5.7 Reference Manual :: 14.12 InnoDB Startup Options and System Variables https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html
- Rails - ActiveRecordをutf8mb4で動かす - Qiita http://qiita.com/kamipo/items/101aaf8159cf1470d823
最初に結論
utf8mb4のアプリの例
ソース見たら分かるけど、utf8mb4を試すだけの最小なアプリになってる。
これを普通にrake db:migrate:reset
すると'Mysql2::Error: Specified key
was too long; max key length is 767 bytes'
が発生します。
wercker.yml
box: wercker/rvm services: - sinsoku/mysql build: steps: - rvm-use: version: 2.1.3 - bundle-install - rails-database-yml - script: name: Replace encoding on database.yml code: sed -i -e 's/utf8$/utf8mb4/g' config/database.yml - script: name: export MYSQL_CMD code: export MYSQL_CMD="mysql -u root -p$WERCKER_MYSQL_PASSWORD -h $WERCKER_MYSQL_HOST -D $WERCKER_MYSQL_DATABASE" - script: name: Update variables on mysql code: $MYSQL_CMD -e "SET GLOBAL innodb_file_format=barracuda, innodb_large_prefix=true;" - script: name: Set up db code: bundle exec rake db:migrate:reset - script: name: rake spec code: bundle exec rake spec
sinsoku/mysql
werckerが提供しているwercker/box-mysqlではrootでログインできないため、このboxをforkしてallow_remote_root : true
にしたmysqlのboxを作成し、そちらを使うようにしている。
Replace encoding on database.yml
wercker公式のrails-database-yml
で生成されるdatabase.yml
はutf8なので、sedで無理やりutf8mb4に置換している。
Update variables on mysql
ActiveRecordでutf8mb4のVARCHAR(255)のカラムにindexを貼るためにはinnodb_large_prefix
の設定とinnodb_file_format=barracuda
の指定、更にROW_FORMATをDYNAMIC
もしくはCOMPRESSED
にする必要がある。
そのため、sqlコマンドで設定を書き換えている。
動いた
リモートからrootでログインできるのは対応が適当すぎる気もするけど、その他の設定をしたい時に便利そうだし、とりあえずこれでいいかな。
*1:英語で問い合わせたら、forkして自分の好きなboxが作れるよって返ってきた