在使用 laravel 自带的迁移数据库的命令时报错:

 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_e
mail_unique`(`email`))

解决方案一:
手动配置迁移生成的默认字符串长度
修改 /app/Providers/AppServiceProvider.php 中的 Schema::defaultStringLength方法来配置

use Illuminate\Support\Facades\Schema;

/**
 * 引导任何应用程序服务。
 *
 * @return void
 */
public function boot()
{
 Schema::defaultStringLength(191);
}

解决方案二:
如果数据库的引擎使用的是 myisam (myisam存储引擎在创建索引的时候,索引键长度是有一个较为严格的长度限制的,所有索引键最大长度总和不能超过 1000,而且不是实际数据长度的总和,而是索引键字段定义长度的总和。)

编码 大小 字符
latin1 1 byte 1 character
gbk 2 byte 1 character
uft8 3 byte 1 character
uft8mb4 4 byte 1 character

修改数据库使用引擎来解决,config/database.php 配置数据库默认的引擎

#参数改为InnoDB,也可以添加参数默认设置为 InnoDB ROW_FORMAT=DYNAMIC
return [
...
'mysql' => [
    ...
  'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
],
...
];

注意:mysql 的版本的默认配置不同也会造成创建表时的 ROW_FORMAT 的默认值不同或 innodb_large_prefix 配置不同,当 innodb_large_prefix 为 OFF 的最大值为 767 bytes,当为 ON 时最大值为 3072bytes
其中解决方案二不适合所有人特别是数据量大的数据库,根据自己的业务需要了解引擎特性和静态表和动态表之间的区别。

文档更新时间: 2021-02-24 18:33   作者:cranux