久しぶりに、LaravelをインストールしてMySQLでデータベースを作り、以下ようにartisanコマンドでマイグレーションしようとしたら、QueryExceptionやPDOExceptionのエラー発生してハマってしまいましたので、その時の対処法をご紹介します。
インストールするLaravelバージョンを飛ばしたので後からわかったのですが、他のバージョンでも同じエラーが発生するらしいです。
マイグレーションのエラー内容
いつものように、テーブルを追加するマイグレーションを実行してみます。
1 |
php artisan migrate |
すると、以下のようなエラーが表示されます。
1 2 3 |
[IlluminateDatabaseQueryException] 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`)) |
または、Laravel標準の認証機能を追加してみます。
1 |
php artisan make:auth |
を実行したところ、やはり似たようなエラーが表示されます。
1 2 3 |
[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes |
![管理者](https://minory.org/wp-content/uploads/2022/01/avater-150x150.png)
何?
どっちもSyntax errorだと??
マイグレーションエラーの原因
結論から言うと、Laravel 5.4からcharasetがutf8mb4に変わり、MySQLでユニーク制約を付けたカラムには767bytesまでしか入らない仕様になっているからだそうです。。
2つの対処法
設定を変更する前に、1度マイグレーションに失敗すると、以下のテーブルが残っていると思いますので、以下のテーブルを綺麗に削除してください。
- migrations
- users
余談ですが、今後のことを考え、GUIで簡単にデータベースを操作できるよう「adminer.php」を入れることをオススメします。
![](https://minory.org/wp-content/uploads/2017/11/adminer-e1658589610109-300x200.png)
1. AppServiceProvider.phpを変更
[app/providers/AppServiceProvider.php
]ファイルを書き換え、デフォルトのバイト数を指定します。
そうすると、次回からマイグレーションファイルを作成した際にバイト数を設定しなくてもエラーが発生することはありません。
まずは、先頭の方に以下を追加します。
1 |
use Illuminate\Support\Facades\Schema; |
それから、bootメソッド内に[Schema::defaultStringLength(191);
]を追加します。
1 2 3 4 |
public function boot() { Schema::defaultStringLength(191); } |
これでマイグレーションを実行してもエラーは発生しなくなります!
![](https://picperf.io/https://laravelnews.s3.amazonaws.com/images/laravel-key-too-long.png)
2. create_users_table.phpを変更
もう1つはマイグレーションファイルを書き換える方法です。
[database/migrations/2014_10_12_000000_create_users_table.php
]ファイルを開いて、エラーで表示されていた箇所を見てみます。
1 |
$table->string('email')->unique(); |
このstringメソッドの第2引数にバイト数を入力します。
1 2 3 4 5 6 7 8 9 10 11 |
public function up() { Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email', 255)->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } |
他にもMySQLのバージョンやcharasetを変えるなどの対処法があるようなので、知りたい方は以下の参考サイトをご覧ください。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TGFyYXZlbDUuNCVFNCVCQiVBNSVFNCVCOCU4QSVFMyU4MCU4MU15U1FMNS43LjclRTYlOUMlQUElRTYlQkElODAlMjAlRTMlODElQTd1c2VycyVFMyU4MyU4NiVFMyU4MyVCQyVFMyU4MyU5NiVFMyU4MyVBQiVFMyU4MSVBRSVFMyU4MyU5RSVFMyU4MiVBNCVFMyU4MiVCMCVFMyU4MyVBQyVFMyU4MyVCQyVFMyU4MiVCNyVFMyU4MyVBNyVFMyU4MyVCMyVFMyU4MiU5MiVFNSVBRSU5RiVFOCVBMSU4QyVFMyU4MSU5OSVFMyU4MiU4QiVFMyU4MSVBOCUyMFN5bnRheCUyMGVycm9yJTIwJUUzJTgxJThDJUU3JTk5JUJBJUU3JTk0JTlGJUUzJTgxJTk5JUUzJTgyJThCJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz04MmY4Mjk1YzI2MjVjM2Y1NTA1YTliZmE4MTdhMzRlOQ&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBhY2hlbF9iOCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MTdkOGE3MjkyYzJhOGE0Y2U1YWU1MDA4Y2MwMmIzM2E&blend-x=142&blend-y=486&blend-mode=normal&s=12790b0dffa1d066bf13c8df77ea5bf8)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TXlzcWwlRTMlODElQTclRTMlODMlQTYlRTMlODMlOEIlRTMlODMlQkMlRTMlODIlQUYlRTUlODglQjYlRTclQjQlODQlRTMlODIlOTIlRTMlODElQTQlRTMlODElOTElRTMlODElOUZ2YXJjaGFyJUUzJTgxJUFGNzY3Ynl0ZSVFMyU4MSVCRSVFMyU4MSVBNyVFMyU4MSU5NyVFMyU4MSU4QiVFNSU4NSVBNSVFMyU4MiU4OSVFMyU4MSVBQSVFMyU4MSU4NCVFOCVBOSVCMSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9OThjOTJhOTAwNzZlM2I3ODFhZjEzNGZkOTI3OTczZDQ&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDByaXR1a2lpaSZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9YTBkMjhjMjAzNmU1MjVmN2RlNjA3Y2QzMjRkNGZjMWU&blend-x=142&blend-y=486&blend-mode=normal&s=289671b1918b0f2ac64aff895d7b564f)
コメント
コメント一覧 (1件)
[…] artisan migrateをするとエラーになるのです。 Laravel 5.5でマイグレーションのエラーが発生した場合の2つの対処法https://minory.org/laravel-migrate-error.htmlLaravel […]