【问题标题】:Migrations - 1071 Specified key was too long - Proper Solution迁移 - 1071 指定的密钥太长 - 正确的解决方案
【发布时间】:2021-03-13 20:38:56
【问题描述】:

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

我已经看到了多个建议的解决方案here,但不认为接受的解决方案是更好的解决方案。

我试图在默认的 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 版本或 MariaDB 版本早于 10.2.2 版本,您可能需要手动配置迁移生成的默认字符串长度,以便 MySQL 为其创建索引.您可以通过在 AppServiceProvider 中调用 Schema::defaultStringLength 方法来配置它:

我恰好使用的是 5.7.28 版

【问题讨论】:

标签: laravel laravel-8


【解决方案1】:

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

我恰好使用的是 5.7.28 版

【讨论】:

    【解决方案2】:

    正如错误所指出的,您可以在提供程序中设置默认字符串长度,这可能是AppServiceProvider.php

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

    【讨论】:

      【解决方案3】:

      如需进一步阅读,请查看innodb limits,特别是索引每行的 767 字节限制。

      所以有几件事要带走:

      1. 此问题适用于使用 InnoDB 存储引擎(大多数情况下为默认)存储的表
      2. 它适用于早于 5.7.7 的 MySQL,但也适用于 5.7.7 之后使用不同参数而非默认值的版本。​​
      3. 数据库本身没有固有的默认长度。默认长度是 Laravel 的一个特性。
      4. 默认长度为 255 个字符,这意味着每个字符最多可以有 2 个字节才能在给定字段上创建索引,因此utf8 可以,但utf8mb4 不行。

      Schema::defaultStringLength() 是建议的解决方案,如果您没有微调字段长度的选项。在理想情况下,您的字段长度已经根据将插入其中的预期数据进行了微调。这应该可以让您更快地发现输入错误。

      所以我建议你使用Schema::defaultStringLength(191);,如果你不能改变你的innodb设置但仍然根据你真正的预期需求微调你的字段长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-22
        • 2012-02-03
        • 2013-12-21
        • 2015-06-29
        • 2016-10-04
        • 2017-02-27
        相关资源
        最近更新 更多