werckerのmysqlでutf8mb4を使う

werckermysqlのutf8mb4を使う方法が分かったのでまとめておく。

参考にしたページ

最初に結論

  • mysqlのboxを自分で作るしかない*1
  • 面倒なのでrootでログインできるようにした

utf8mb4のアプリの例

sinsoku/rails_with_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コマンドで設定を書き換えている。

動いた

RAILS_WITH_UTF8MB4 - wercker

リモートからrootでログインできるのは対応が適当すぎる気もするけど、その他の設定をしたい時に便利そうだし、とりあえずこれでいいかな。

*1:英語で問い合わせたら、forkして自分の好きなboxが作れるよって返ってきた