Laravel6環境で、DBテーブルを作成しようとしたら、エラーが発生した。原因と解消方法を残す。
確認環境
- Laravel 6
- MySQL 5.5
エラーメッセージ内容
Illuminate\Database\QueryException : 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`))
at /var/www/html/danroo.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
665| // If an exception occurs when attempting to run a query, we'll format the error
666| // message to include the bindings with SQL, which will make this exception a
667| // lot more helpful to the developer instead of just the database's errors.
668| catch (Exception $e) {
> 669| throw new QueryException(
670| $query, $this->prepareBindings($bindings), $e
671| );
672| }
673|
原因
以下の2つの制限がemailカラムでぶつかってしまったようだ。
Laravel5.4から標準charsetが「utf8mb4」に変更されたため、
1文字あたりのバイト数が最大4バイトになったこと
MySQL5.7.7以前のバージョンでは、
PRIMARY_KEYやUNIQUE_KEYを付けたカラムには、767bytesまでしか格納できないこと
解消方法
解消方法はミドルウェアバージョン変更とLaravel側のcharset設定変更のどちらかがやりやすい。
(方法1)docker-compose.ymlで、「image: mysql:5.5」と指定していたので、
「image: mysql:latest」や「image: mysql:5.7」に変更する
(方法2)config/database.phpの55行目あたり(connections.mysql 配列内)を変更する
- 'charset' => 'utf8mb4',
- 'collation' => 'utf8mb4_unicode_ci',
+ 'charset' => 'utf8',
+ 'collation' => 'utf8_general_ci',