DBを変更した動機
Rails製のアプリをherokuにデプロイしmigrationした際、以下のようなエラーに遭遇しました
Mysql2::Error: Specified key was too long; max key length is 767 bytes
これはDBのcharsetがutf8mb4であったことが原因です
utf8mb4は1文字が4バイトなので
varchar(255)を扱う場合、255 * 4バイト = 1020バイトとなり767バイトを超えてしまいます
そのためインデックスキーを貼れずにエラーになってしまいます。
調べているといろいろな手段がありました
色々な解決方法
1. utf8mb4からutf8に変更する
utf8は1文字が3バイトなので
255 * 3バイトでMAXが765バイトになるので納まるのですが、MySQL5.5のutf8では絵文字を扱うことができません
絵文字を扱いたかったのでこれではダメです
2. varcharの最大長を765バイト以下になるようにする
x * 4 > 765 でMAXで191文字まで大丈夫だということがわかります
t.string :awesome_string_column, limit: 191
しかし、DB都合でアプリケーションに制約を持たせるは嫌なのでダメです
3. DBのフォーマットを変更する
MySQLの設定ファイルであるmy.cnf
でファイルフォーマットの設定を変更すれば3072バイトまで拡張されるようです
innodb_file_format=Barracuda
しかしherokuのclearDBではmy.cnf
がいじれない(多分)ので不可能でした
4. MySQLのversionを上げる
デフォルトでverison: '5.5.62'
であるClearDBのMySQLバージョンをあげてあげたら解決しそう
heroku addons:create cleardb:ignite --name=my-db-name --version=5.7
しかしherokuのフリープランignite
では上げることができない模様...
困りました
採用した解決方法
JawsDBというClearDBとほぼ変わりがない(らしい)MySQLデータベースを採用することにしました(無料)
JawsDB users can choose their database version at provision time by specifying a --version flag. Versions 5.7 and 8.0 are currently supported. If no version flag is supplied, the default database version will be used. The current default database version is 5.7
デフォルトが5.7で8.0まで行けるんですね
アドオンを追加します
デフォルトのバージョンが5.7ですが念のため明記しておきます
heroku addons:create jawsdb:kitefin --name=my-db-name --version=5.7
JawsDBの情報を見ます
$ heroku config | grep JAWSDB_URL
> JAWSDB_URL: mysql://<username>:<password>@<host>/<databse>
接続情報が見られるのでドライバを変更してあげます
heroku config:set DATABASE_URL='mysql2://<username>:<password>@<host>/<database>?reconnect=true'
その後マイグレーションするとエラーを出さずに実行できました!
ジョーズの背びれが可愛いですね🦈