Specified key was too long; max key length is 767 bytes
インデックスを作る際に、型長×文字コードのサイズ >767
なカラムに作ろうとすると出る。
例えばこんな感じ
CREATE TABLE `test` ( `COMMENT` varchar(192) NOT NULL DEFAULT '', KEY i_test_1 (`COMMENT`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
0 row(s) affected, 3 warning(s): 1071 Specified key was too long; max key length is 767 bytes
興味深いのが、インデックスではワーニング
にはなるものの、テーブルは作ってくれる。
その証拠に、show create tableで確認してみると、
show create table test;
CREATE TABLE `test` ( `COMMENT` varchar(192) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', KEY `i_test_1` (`COMMENT`(191)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC
191文字で切り詰めた形でインデックス作ったよ、という風に見える。 いや、エラーにしようよ・・・。
一方、インデックスをユニークキーや主キーにすると、その場合はエラーになる。
CREATE TABLE `test` ( `COMMENT` varchar(192) NOT NULL DEFAULT '', UNIQUE KEY i_test_1 (`COMMENT`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
Error Code: 1071. Specified key was too long; max key length is 767 bytes
utf8だと255文字まで、utf8mb4だと191文字まで
あんまりお目にかからないかもしれないけど、頭の片隅に入れとくと良いです。 (ちなみに、複合インデックスの場合、合計ではなく、どれかがこれにあたるか?で判断されます)