Specified key was too long

  1. [Illuminate\Database\QueryException]
  2. SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique (email))
  3. [PDOException]
  4. SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

在 Laravel 5.4 之后的版本中使用 php artisan migrate 命令时有可能会出现此错误提醒,出现此错误的条件是:

  • 表字段类型为 varchar
  • 字段长度大于 191
  • 该字段上添加有 unique 索引
  • MySQL 版本小于 5.7.7

这里有一份较为官方的解决方案:Laravel 5.4 常见错误:Specified key was too long
你要做的是编辑 AppServiceProvider.php 文件,并在 boot 方法内设置默认字符串的长度:

  1. <?php
  2. use Illuminate\Support\Facades\Schema;
  3. public function boot()
  4. {
  5. Schema::defaultStringLength(191);
  6. }

在这里我推荐另外的解决方案

  1. 升级 MySQL 版本,当 MySQL 版本大于 5.7.7 时,此限制将被解除;
  2. 如果无法升级 MySQL 版本,参看这里,修改 MySQL 的参数配置:
innodb-file-format=Barracuda
innodb_large_prefix=ON

这两种解决方案是从根源解决问题。