tohokuaikiのチラシの裏

技術的ネタとか。

MySQLのUNIQUE制約のキー長制限に引っかかった

LaravelのユーザーテーブルのEmailのUNIQUEが掛けられなかった。

Server version: 5.5.65-MariaDB MariaDB Server

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

maxで767Byteなんだけど、…ってことは、UTF8が1文字4byteで計算されてるのかな?

767÷4=191.75なので…191文字までなら大丈夫なのかな?

ということで実験

VARCHAR(192)にしてみる

MariaDB [foodb]> alter table users change email email varchar(192) not null;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [foodb]> alter table `users` add unique `users_email_unique`(`email`);
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

ダメだって…

VARCHAR(191)にしてみる

MariaDB [foodb]> alter table users change email email varchar(191) not null;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [foodb]> alter table `users` add unique `users_email_unique`(`email`);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

計画通り(夜神ライトAA略

理由

show create table users;

してみると、

CREATE TABLE `users` (
...略...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

ってなってて、utf8mb4だった。ので4byteなのね。