【问题标题】: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 选项 数据库。请参阅数据库的文档以获取有关 如何正确启用此选项。

      【讨论】:

        【解决方案3】:

        这是 Laravel 5.4 中的一个错误

        要修复它,请将其放在 Schema::create 方法调用之上:

        Schema::defaultStringLength(191);
        

        在这里阅读更多:

        https://github.com/laravel/framework/issues/17508

        【讨论】:

          猜你喜欢
          • 2020-03-15
          • 1970-01-01
          • 2016-12-18
          • 2018-07-21
          • 2018-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多