📜  laravel 迁移错误默认字符 199 启动 - PHP (1)

📅  最后修改于: 2023-12-03 14:43:50.269000             🧑  作者: Mango

Laravel 迁移错误默认字符 199 启动 - PHP

在 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 的默认迁移在创建索引时使用了较长的字符串,因此会导致上面的错误消息。

解决方案

既然我们知道了问题的根本原因,我们可以采取以下步骤来解决这个问题:

  1. AppServiceProvider 中设置索引的最大长度为 191 个字符:
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
  1. 如果你使用了之前版本的 Laravel,可以通过降低 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 应用程序进行必要的更改,我们可以避免这些问题并将集中精力编写出更好,更健壮的代码。