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()
{
//
}
}