📅  最后修改于: 2023-12-03 14:43:50.269000             🧑  作者: Mango
在 Laravel 应用程序使用迁移时,"默认字符 199" 启动错误经常被开发人员遇到。 这个问题可能会引起许多麻烦,但它的解决方案幸运地来得很容易。
当你执行迁移,你可能会看到一个错误消息,如下所示:
[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table `table_name` add index `table_name_column_name_index`(`column_name`))
这个错误的根源是 MySQL 的默认设置。 在 MySQL 版本 5.7.7 和更新版本中,索引长度的默认字符集和排序规则被更改为 utf8mb4 。 这使得索引的最大长度从 1000 字节降至 191 个字符 (utf8mb4 的最大字符长度)。
Laravel 的默认迁移在创建索引时使用了较长的字符串,因此会导致上面的错误消息。
既然我们知道了问题的根本原因,我们可以采取以下步骤来解决这个问题:
AppServiceProvider
中设置索引的最大长度为 191 个字符:use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
config/database.php
中的字符串长度来增加索引长度:'mysql' => [
// ...
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'options' => [
\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
]
]
以上配置更改确保使用新的字符集和字符排序规则生成迁移标准的 CREATE 语句。
完成以上步骤后,您应该能够重新运行迁移并成功创建索引了。
"默认字符 199" 启动错误可能会很讨厌,但现在我们知道如何快速解决它了!通过了解 MySQL 的默认设置,并对 Laravel 应用程序进行必要的更改,我们可以避免这些问题并将集中精力编写出更好,更健壮的代码。