困った、という感じだったので原理をメモる。
環境
mysql> select version(); +------------+ | version() | +------------+ | 5.7.17-log | +------------+ 1 row in set (0.01 sec)
事象
indexを貼ろうとしたときに対象のカラムのバイト数が767byteを超えると
Index column size too large. The maximum column size is 767 bytes.
というような表示が出て、エラーとなる。
対策
以下のように設定値を変更する
innodb_large_prefix=ON innodb_file_format=Barracuda innodb_file_format_max=Barracuda
それぞれのオプションの意味
項目ごとにドキュメントの記載を見ていく。
なお、ファイル形式のAntelopeとBarracudaの差異に関しては以下のkamipoさんのブログを見ると良い
InnoDBの制限とファイルフォーマットAntelopeとBarracudaの違い - かみぽわーる
innodb_large_prefix
このオプションを有効にすると、DYNAMIC および COMPRESSED 行フォーマットを使用する InnoDB テーブルで、767 バイトよりも長い (最大で 3072 バイトの) インデックスキープリフィクスが許可されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数
innodb_file_format
新しい InnoDB テーブルで使用されるファイル形式です。現在は、Antelope および Barracuda がサポートされています。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数
innodb_file_format_max
サーバーの起動時に InnoDB によって、この変数の値がシステムテーブルスペースのファイル形式タグ (Antelope や Barracuda など) に設定されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数