今更ながら "Index column size too large. The maximum column size is 767 bytes." に遭遇した

Symfony、というかDoctrineでmigrateしたら、うっかり以下のようなエラーに遭遇。

Index column size too large. The maximum column size is 767 bytes.

utf8mb4だと、varchar(255)とかインデックス張ると767バイト超えてしまって失敗してしまうっていうやつ。

これを解消しようと思うと、innodb_large_prefixを有効にすればいいのだけど、そのためにはinnodb_file_formatBarracudaにして、テーブルのROW_FORMATDYNAMICCOMPRESSEDでもいい)にしなきゃいけない。

ということで、*.cnfに以下を追記。

innodb_large_prefix = 1
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda

で、マイグレーションファイルを開いて、$this->addSql('CREATE TABLE ...')の末尾にROW_FORMAT=DYNAMICを付け足したり、$this->addSql('ALTER TABLE foo ROW_FORMAT=DYNAMIC;')の一行を追加したりとか、状況に応じてすればいい。

参考