読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE UNIQUE INDEX

このエラーが起きるのは「indexを貼る対象のカラム容量の総量が767bytesを超えているとき」なんだけど、解決方法がいくつかある。

すなおに容量調整

だったら初めからそんな容量にしてねえよ、というケースがほとんどかもしれない。

文字コードを工夫する

utf8mb4を使っていたりする場合は、工夫の余地があるかも。

MySQLでは

  • DBごと
  • テーブルごと
  • カラムごと

にindexが貼れたりするので、たとえば原因のカラムがこのへんを工夫して回避できるならそれで回避する。ただ、カラムごとレベルになると管理が大変になると思うし、そもそもRailsとか使ってる場合、migrationがうまく対応できるのかよくわからない。

MySQL側の設定でリミットを広げる

http://blog.kamipo.net/entry/2012/11/13/102024

MySQLが5.5.14以上の場合は、innodb_large_prefixというオプションを設定することによって、リミットが3072byteになる。このオプション、数値を設定するんじゃなくて、入れるか入れないかなんで、間違いないように。


ちなみにutf8mb4絡みの場合、railsでmysql2使っててバージョンが0.3.11以下のものはそもそも対応してないので現状ベータ版の0.3.12以上を使う必要があるのもお忘れなく。

また「本番はRDS」とかいう想定の場合も、ちゃんとローカルで成立した構成がRDSで実現できるのか確認しておく必要があるよなぁ。今度確認しよっと。。。

追記)innodb_large_prefixの設定はいじれるらしい。
https://forums.aws.amazon.com/ann.jspa?annID=1374

取り急ぎ。