首頁 >後端開發 >php教程 >解決 Laravel 遷移中的 SQLSTATE[ 錯誤:金鑰長度問題

解決 Laravel 遷移中的 SQLSTATE[ 錯誤:金鑰長度問題

Susan Sarandon
Susan Sarandon原創
2024-12-31 17:30:15456瀏覽

Resolving the SQLSTATE[ Error in Laravel Migrations: Key Length Issue

如果您正在使用 Laravel 並在遷移過程中遇到可怕的 SQLSTATE[42000] 錯誤,那麼您並不孤單。此錯誤通常是由於使用 MySQL 作為資料庫時的金鑰長度問題造成的。在這篇部落格中,我們將深入研究該錯誤並提供清晰的逐步解決方案。

☠️問題:SQLSTATE[42000]金鑰長度問題

運行遷移時,您可能會看到以下錯誤:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes

例如,以下遷移指令失敗:

php artisan migrate

?錯誤詳細資訊
當 Laravel 嘗試在使用者資料表中的欄位(例如電子郵件)上建立唯一索引時,就會發生這種情況。預設字串長度 255 個字元超出了 MySQL 配置允許的最大金鑰長度,特別是在使用 utf8mb4 字元集(支援表情符號)時。

?解決方案:調整表字元集和排序規則

要解決此問題,您可以在移轉檔案中指定資料表的字元集和排序規則。操作方法如下:

第 1 步:開啟遷移檔案
找到導致問題的遷移文件,例如:
資料庫/遷移/0000_00_00_000000_create_users_table.php

第 2 步:新增字元集和排序規則
修改遷移檔案中的 up() 方法以包含字元集和排序規則屬性:

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->timestamps();

    // Add charset and collation
    $table->charset = 'utf8';
    $table->collation = 'utf8_unicode_ci';
});

⁉️ 為什麼這有效
透過將字元集設為 utf8 並將排序規則設為 utf8_unicode_ci,可以減少每個字元的最大位元組長度,從而避免密鑰長度問題。該解決方案犧牲了對某些多位元組字元(如表情符號)的支援以實現相容性。

?替代解決方案:全域縮短字串長度

如果您想確保在其他遷移中不會出現此問題,您可以在 AppServiceProvider 中定義預設字串長度:

第 1 步:開啟 AppServiceProvider
導航至 app/Providers/AppServiceProvider.php。

第 2 步:更新啟動方法
在 boot 方法中加入以下程式碼:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191); // Shorten the default string length
}

此方法減少了全域所有遷移的字串長度。

結論

遷移過程中的 SQLSTATE[42000] 錯誤可能是一個絆腳石,但透過這些修復,您可以快速解決它並繼續建立您的 Laravel 應用程式。無論您選擇調整特定遷移還是設定全域預設字串長度,您現在都將擁有有效處理此問題的工具。

?分享你的想法

您在 Laravel 開發過程中是否曾經遇到類似的錯誤?你是如何解決這些問題的?在下面的評論中分享您的經驗!

編碼愉快! ?

以上是解決 Laravel 遷移中的 SQLSTATE[ 錯誤:金鑰長度問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn