【问题标题】:Laravel 5.4 migrate key is too long errorLaravel 5.4 migrate key is too long 错误
【发布时间】:2017-08-26 11:52:55
【问题描述】:

当我使用 laravel 5.4 运行 migrate 命令时,我得到一个错误“特定密钥太长”,我搜索并发现很多人也面临这个错误。常见的是在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%"):

所以我认为我不需要更改任何内容,但我仍然遇到问题。这让我很困惑。谁能帮我?谢谢。

【问题讨论】:

  • 您是否在迁移中定义了唯一的复合键?

标签: mysql laravel laravel-5 laravel-5.4 mysql-5.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 engineconfig/database.php。如果您使用的是旧版本,则必须在每次创建表的迁移中指定这一点。 $table->engine = 'innodb row_format=dynamic';

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      转到 config/database.php 设置这个“引擎”=>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'),
              ]) : [],
          ],
      

      【讨论】:

        猜你喜欢
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 2021-12-14
        • 1970-01-01
        • 2017-02-18
        • 1970-01-01
        • 2021-02-19
        相关资源
        最近更新 更多