Laravel 迁移:唯一键太长,即使指定

2022-08-30 06:29:36

我正在尝试迁移 Laravel 中的用户表。当我运行迁移时,我收到此错误:

[Illuminate\Database\QueryException]SQLSTATE[42000]:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节(SQL:更改表添加唯一users_email_uniq(usersemail))

我的迁移如下:

Schema::create('users', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('name', 32);
    $table->string('username', 32);
    $table->string('email', 320);
    $table->string('password', 64);
    $table->string('role', 32);
    $table->string('confirmation_code');
    $table->boolean('confirmed')->default(true);
    $table->timestamps();

    $table->unique('email', 'users_email_uniq');
});

经过一些谷歌搜索,我遇到了这个错误报告,Taylor说你可以将索引键指定为的第二个参数,我已经做到了。它仍然给出错误。这是怎么回事?unique()


答案 1

为电子邮件指定较小的长度:

$table->string('email', 250);

这是默认值,实际上:

$table->string('email');

你应该是好的。

对于Laravel 5.4,您可以在此Laravel 5.4中找到解决方案:指定的键太长错误,Laravel新闻帖子:

如迁移指南中所述,要解决此问题,您只需编辑 AppServiceProvider.php文件,并在引导方法中设置默认字符串长度:

use Illuminate\Database\Schema\Builder;


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

答案 2

更新 1

Laravel 5.4开始,不再需要这些更改。

Laravel 5.4 默认使用 utf8mb4 字符集,其中包括支持在数据库中存储“表情符号”。如果要从 Laravel 5.3 升级应用程序,则无需切换到此字符集。

更新 2

默认情况下,当前生产 MariaDB 版本全局不支持此设置。默认情况下,它是在 MariaDB 10.2.2+ 中实现的。

溶液

如果您有意使用正确的未来默认值(从 Laravel 5.4 开始),则 UTF8 多字节支持utf8mb4


推荐