Laravel 5.4迁移密钥太长错误

时间:2017-04-01 06:46:22

标签: mysql laravel laravel-5 laravel-5.4 mysql-5.7

当我使用laravel 5.4运行migrate命令时出现错误"特定密钥太长",我搜索并发现许多人也遇到此错误。常见的是在Schema::defaultStringLength(191);中添加AppServiceProvider.php。但文档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%"):

enter image description here

所以我认为我不需要改变任何东西,但我仍然遇到问题。这让我感到困惑。谁能帮我?感谢。

3 个答案:

答案 0 :(得分:1)

  1. 设置innodb_file_format=Barracuda
  2. 设置innodb_large_prefix=1
  3. 设置innodb_default_row_format=dynamic
  4. 步骤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

    config/database.php中的

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

答案 1 :(得分:0)

我认为您应该确保将innodb_large_prefix设置为On。根据{{​​3}},它应该是Mysql> = 5.7.7中的默认值,但也许您使用非标准设置。

答案 2 :(得分:-1)

转到config / database.php 设置这个'engine'=> innodb。

'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => innodb,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],