【问题标题】:laravel 5.4 migration not working properlylaravel 5.4 迁移无法正常工作
【发布时间】:2017-10-05 05:00:19
【问题描述】:
我在使用 laravel 迁移在数据库中创建表时遇到了这个问题。我不知道它可能有什么问题,因为我在以前的系统上使用了相同的命令。这是我在使用 composer 创建表时遇到的错误。
$ php artisan migrate 迁移表创建成功。
[Illuminate\Database\QueryException] SQLSTATE[42000]:语法错误
或访问冲突:1071 指定的密钥太长;最大键
长度为767字节(SQL:alter table users add unique
users_email_unique(email))
[PDOException] SQLSTATE[42000]:语法错误或访问冲突:
1071 指定的密钥太长;最大密钥长度为 767 字节
【问题讨论】:
标签:
php
laravel-5
laravel-5.4
【解决方案1】:
Laravel 5.4 默认使用utf8mb4。解决此错误的一种方法是默认返回utf8。
转到您的config\database.php 并将数据库charset 更改为uft8 并将collation 更改为utf8_unicode_ci:
'mysql' => [
//..
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
//..
],
【解决方案2】:
字符限制取决于您使用的字符集。 Laravel 正在使用utf8mb4,其最大索引的字符限制为191。
你只需要设置你的字符限制来纠正一个。从这里读到
Laravel Index Length
索引长度和 MySQL / MariaDB
Laravel 默认使用utf8mb4 字符集,其中包括
支持在数据库中存储“表情符号”。如果您正在运行
MySQL 的版本早于 5.7.7 版本或 MariaDB 早于
10.2.2 发布,可能需要手动配置默认
迁移生成的字符串长度,以便 MySQL 创建
他们的索引。您可以通过调用
Schema::defaultStringLength你的AppServiceProvider中的方法:
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
或者,您可以启用innodb_large_prefix 选项
数据库。请参阅数据库的文档以获取有关
如何正确启用此选项。