文字列にインデックスを貼る場合カラム長に気をつけろ

何が起きた?

下記のようなcreate tableをプルリクに混ぜたところ、先輩に文字列にインデックス貼るときはカラム長制限あるから気をつけろとコメントいただきました。

CREATE TABLE `test` (
  `hoge` varchar(255) NOT NULL,
  PRIMARY KEY (`hoge`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

確かに調べてみると制限があるらしい。

プリフィクスのサポートやプリフィクスの長さ (サポートされている場合) は、ストレージエンジンに依存します。たとえば、InnoDB テーブルではプリフィクスの長さを最大 767 バイトに、また innodb_large_prefix オプションが有効になっている場合は 3072 バイトにすることができます。MyISAM テーブルの場合、プリフィクスの制限は 1000 バイトです。

https://dev.mysql.com/doc/refman/5.6/ja/create-index.html

でもcreate table文通ったのなんでだろうとmysqlの設定をみていると、innodb_large_prefix オプションが有効になっていた。 そのためwarningが出ずにテーブル作成できてしまった模様

mysql> SHOW VARIABLES LIKE '%large_prefix%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | ON    |
+---------------------+-------+
1 row in set (0.01 sec)

対応したこと

絵文字が入る予定ないのでutfmb4をやめてutf8にしました

参考

next4us-ti.hatenablog.com