Laravel 迁移-1071指定的密钥太长-正确的解决方案

Laravel 迁移-1071指定的密钥太长-正确的解决方案,laravel,laravel-8,Laravel,Laravel 8,我刚刚开始使用Laravel(8),对如何正确修复这个错误有点困惑 我见过多个建议的解决方案,但不认为接受的解决方案是更好的解决方案 我试图在默认的Laravel项目上执行php artisan migrate:fresh。我能够通过使用涉及指定特定字段长度的解决方案来解决这个问题 Schema::create('users', function (Blueprint $table) { $table->id(); $table->string

我刚刚开始使用Laravel(8),对如何正确修复这个错误有点困惑

我见过多个建议的解决方案,但不认为接受的解决方案是更好的解决方案

我试图在默认的Laravel项目上执行
php artisan migrate:fresh
。我能够通过使用涉及指定特定字段长度的解决方案来解决这个问题

    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name', 50);
        $table->string('email', 100)->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password', 24);
        $table->rememberToken();
        $table->timestamps();
    });
公认的解决方案是修改
Schema::defaultStringLength()

这只是个人喜好吗

编辑:我注意到文档中还有一个额外的细节

如果您运行的MySQL版本早于5.7.7版本或早于10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便MySQL为其创建索引。您可以通过在AppServiceProvider中调用Schema::defaultStringLength方法来配置此选项:

我只是碰巧使用了5.7.28版

如果您运行的MySQL版本早于5.7.7版本或早于10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便MySQL为其创建索引。您可以通过在AppServiceProvider中调用Schema::defaultStringLength方法来配置此选项:


我碰巧使用的是5.7.28版,正如错误指定的那样,您可以在提供程序中设置默认字符串长度,可以是
AppServiceProvider.php

public function boot()
{
    Schema::defaultStringLength(191);
}

为了进一步阅读,请特别查看索引每行的767字节限制

因此,有一些东西需要带走:

  • 该问题适用于使用InnoDB存储引擎存储的表(大多数情况下为默认值)
  • 它适用于5.7.7之前的MySQL,也适用于5.7.7之后使用不同参数(默认参数除外)的版本
  • 数据库本身没有固有的默认长度。默认长度特别是一个Laravel特征
  • 255个字符的默认长度意味着每个字符最多可以有2个字节,以便能够在给定字段上创建索引,因此
    utf8
    可以,但
    utf8mb4
    不能
  • 如果您没有微调字段长度的选项,则建议使用
    Schema::defaultStringLength()
    。在理想情况下,您的字段长度将根据插入其中的预期数据进行微调。这将允许您更快地捕获输入错误


    所以我建议使用
    Schema::defaultStringLength(191)如果您无法更改innodb设置,但仍然可以根据实际的预期需要微调字段长度。

    设置defaultStringLength只是将其从默认值255调整为您以往设置的值,您可以自己显式设置字段长度,如果您愿意,是否回答您的问题?如果你“不相信被接受的解决方案是更好的解决方案”,那么还有40个其他方案可供选择。你希望得到什么样的答案?