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

11 浏览
0 Comments

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

我正在尝试在Laravel中迁移用户表。当我运行迁移时,我会得到以下错误:

[Illuminate\\Database\\QueryException] SQLSTATE[42000]: 语法错误或访问权限冲突:1071 指定的键太长;最大键长度为767字节(SQL:alter table users add unique users_email_uniq(email))

我的迁移如下:

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()的第二个参数,我已经这样做了。但仍然出现错误。这是怎么回事?

admin 更改状态以发布 2023年5月22日
0
0 Comments

更新1

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

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

更新2

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

解决方案

如果您有意使用正确的未来默认(从Laravel 5.4开始)UTF8多字节utf8mb4支持,则需要开始修复数据库配置。

在Laravel的config/database.php中定义:

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

DYNAMIC允许存储长键索引。

服务器设置(默认情况下包括在MySQL 5.7.7+ / MariaDB 10.2.2+中):

[mysqld]
# default character set and collation
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
# utf8mb4 long key index
innodb_large_prefix = 1
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_per_table = 1

对于客户端:

[mysql]
default-character-set=utf8mb4

然后停止 MySQL / MariaDB服务器。之后启动。热重启可能无法正常工作。

sudo systemctl stop mysqld
sudo systemctl start mysqld

现在您拥有具有UTF8支持的Laravel 5.x。

0
0 Comments

指定更小的电子邮件长度:

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

实际上这是默认值:

$table->string('email');

然后你就可以继续了。

对于 Laravel 5.4,您可以在 Laravel 5.4:指定的关键字过长错误,Laravel News中找到解决方案:

如在迁移指南中概述的那样,您需要编辑 AppServiceProvider.php 文件并在 boot 方法内设置默认字符串长度:

use Illuminate\Database\Schema\Builder;
public function boot()
{
    Builder::defaultStringLength(191);
}

0