2017-04-01 100 views
0

当我用laravel 5.4运行migrate命令时我得到一个错误“specific key too long”,我搜索并发现很多人也面临这个错误。常见的是在AppServiceProvider.php中加Schema::defaultStringLength(191);。但是文档https://laravel-news.com/laravel-5-4-key-too-long-error表示它是针对那些比5.7.7更早版本的mysql版本。但是,我的版本是5.7.14(mysql Ver 14.14 Distrib 5.7.14, for Win64 (x86_64)),我已经设置MySQL的默认字符集来utf8mb4(show variables like "%char%"):Laravel 5.4 migrate key too long错误

enter image description here

所以我觉得我不需要改变什么,但我仍然得到这个问题。这让我感到困惑。谁能帮我?谢谢。

+0

您是否在迁移中定义了唯一的组合键? – dparoli

回答

0

我想你应该确保你已经设置了innodb_large_prefixOn。根据documentation它应该默认在Mysql> = 5.7.7,但也许你使用非标准设置。

1
  1. innodb_file_format=Barracuda
  2. 设置innodb_large_prefix=1
  3. 设置innodb_default_row_format=dynamic

步骤1(innodb_file_format)和2(innodb_large_prefix)适用于旧的MySQL版本,包括MariaDB的。我不知道这些的较低版本的界限。这些设置为Mysql 5.7.7 changed the defaults,但它们较早存在。

第3步(innodb_default_row_format)需要Mysql 5.7.9或更高版本。

为了文档的缘故;如果您缺少innodb_default_row_format设置,解决方法是使用引擎innodb row_format=dynamic。这违反了Laravel将这个附加到CREATE TABLE语句而没有任何转义的事实,导致... ENGINE=innodb row_format=dynamic

Laravel 5.2.14 introduced the ability to specify the engine in config/database.php。如果您使用的是旧版本,则必须在每次创建表的迁移中指定此值。 $table->engine = 'innodb row_format=dynamic';