# Laravel 常見問題: Specified key was too long

<header class="entry-header" id="bkmrk-laravel-%E5%B8%B8%E8%A6%8B%E5%95%8F%E9%A1%8C%3A-specif"><span style="color: #444444;">Laravel 在 5.4 版之後為了支援 emoji , 因此將資料編碼改為 utf8mb4. 由於 utf8mb4 的儲存空間需求膨脹了4倍, 導致預設長度無法正常寫入資料庫.</span></header>這個問題會在 MySQL 5.7.6 以下與 MariaDB 的環境中出現以下錯誤

<div id="bkmrk-%5Bpdoexception%5D-sqlst"><div>```
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
```

</div></div>在 Migrate 過程中出現這個問題的解決方法有兩種

<div id="bkmrk-%E6%9B%B4%E6%96%B0%E5%88%B0-mysql-5.7.7-%E4%BB%A5%E4%B8%8A%E7%89%88%E6%9C%AC"><div>1. 更新到 MySQL 5.7.7 以上版本
2. 調整 Laravel 的預設資料長度

</div></div>升級 MySQL 的方法就不細說了, 接下來主要說明調整 Laravel 預設值的方法

首先, 編輯專案目錄下的 `app/Providers/AppServiceProvider.php`

新增一個引用

<div id="bkmrk-use-illuminate%5Csuppo"><div>```
use Illuminate\Support\Facades\Schema;
```

</div></div>接著修改 boot function, 將預設長度定為 191

<div id="bkmrk-public-function-boot"><div>```
public function boot()
{
    Schema::defaultStringLength(191);
}
```

</div></div>重新執行 `php artisan migrate` 就不會有問題了

最後附上完整的 AppServiceProvider.php

<div id="bkmrk-namespace-app%5Cprovid">```
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()
    {
        //
    }
}
```

</div>