41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

【MySQL】インデックス作成時のカラム長制限について

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文字まで

あんまりお目にかからないかもしれないけど、頭の片隅に入れとくと良いです。 (ちなみに、複合インデックスの場合、合計ではなく、どれかがこれにあたるか?で判断されます)