目录
收起

    Laravel8首次执行php artisan migrate数据库迁移时报错解决方案

    在首次执行 php artisan migrate 指令,直接就报如下错误:

    Migrating: 2014_10_12_000000_create_users_table
     
       Illuminate\Database\QueryException
     
      SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
     
      at E:\MyLaravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:703
        699▕         // If an exception occurs when attempting to run a query, we'll format the error
        700▕         // message to include the bindings with SQL, which will make this exception a
        701▕         // lot more helpful to the developer instead of just the database's errors.
        702▕         catch (Exception $e) {
      ➜ 703▕             throw new QueryException(
        704▕                 $query, $this->prepareBindings($bindings), $e
        705▕             );
        706▕         }
        707▕     }
     
      1   E:\MyLaravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:492
          PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes")
      2   E:\MyLaravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:492
          PDOStatement::execute()


    报错原因:
    密钥的长度过长。

    如果你正在运行的 MySQL release 版本低于5.7.7 或 MariaDB release 版本低于10.2.2 ,为了MySQL为它们创建索引,你可能需要手动配置迁移生成的默认字符串长度,你可以通过调用 AppServiceProvider 中的 Schema::defaultStringLength 方法来配置它。

    报错的问题就是max key length too long

    那么现在只需要在原本的users migrations代码中添加这一行

    public function up()
        {
            Schema::defaultStringLength(191);//手动控制默认字符串长度
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->string('email')->unique();
                $table->string('password');
                $table->rememberToken();
                $table->timestamps();
            });
        }

    或者也可以找到App\Providers\AppServiceProvider.php 文件里,编辑 boot() 内设置默认字符串长度:

    use Illuminate\Support\Facades\Schema;
     
    public function boot()
    {
        Schema::defaultStringLength(191);
    }

    之后删除掉报错时生成的数据表
    再执行一次 php artisan migrate 指令 就能正常创建了

    2年前(02-25) 更新过本篇文章