如果您正在使用 Laravel 並在遷移過程中遇到可怕的 SQLSTATE[42000] 錯誤,那麼您並不孤單。此錯誤通常是由於使用 MySQL 作為資料庫時的金鑰長度問題造成的。在這篇部落格中,我們將深入研究該錯誤並提供清晰的逐步解決方案。
運行遷移時,您可能會看到以下錯誤:
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中文網其他相關文章!