Laravel 在 5.4 版之後為了支援 emoji , 因此將資料編碼改為 utf8mb4. 由於 utf8mb4 的儲存空間需求膨脹了4倍, 導致預設長度無法正常寫入資料庫.
這個問題會在 MySQL 5.7.6 以下與 MariaDB 的環境中出現以下錯誤
[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
在 Migrate 過程中出現這個問題的解決方法有兩種
- 更新到 MySQL 5.7.7 以上版本
- 調整 Laravel 的預設資料長度
升級 MySQL 的方法就不細說了, 接下來主要說明調整 Laravel 預設值的方法
首先, 編輯專案目錄下的 app/Providers/AppServiceProvider.php
新增一個引用
use Illuminate\Support\Facades\Schema;
接著修改 boot function, 將預設長度定為 191
public function boot() { Schema::defaultStringLength(191); }
重新執行 php artisan migrate
就不會有問題了
最後附上完整的 AppServiceProvider.php
namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } /** * Register any application services. * * @return void */ public function register() { // } }