Laravel迁移:即使指定,唯一键也太长了
Laravel迁移:即使指定,唯一键也太长了
我正在尝试在Laravel中迁移用户表。当我运行迁移时,我会得到以下错误:
[Illuminate\\Database\\QueryException] SQLSTATE[42000]: 语法错误或访问权限冲突:1071 指定的键太长;最大键长度为767字节(SQL:alter table
users
add unique users_email_uniq(
我的迁移如下:
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
从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。
指定更小的电子邮件长度:
$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); }