php artisan migrateを実行したら、Specified key was too long; max key length is 767 bytes が発生した

php artisan migrateを実行したら、Specified key was too long; max key length is 767 bytes が発生した

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',

参考リンク

Web技術カテゴリの最新記事