Laravel 迁移-1071指定的密钥太长-正确的解决方案
我刚刚开始使用Laravel(8),对如何正确修复这个错误有点困惑 我见过多个建议的解决方案,但不认为接受的解决方案是更好的解决方案 我试图在默认的Laravel项目上执行Laravel 迁移-1071指定的密钥太长-正确的解决方案,laravel,laravel-8,Laravel,Laravel 8,我刚刚开始使用Laravel(8),对如何正确修复这个错误有点困惑 我见过多个建议的解决方案,但不认为接受的解决方案是更好的解决方案 我试图在默认的Laravel项目上执行php artisan migrate:fresh。我能够通过使用涉及指定特定字段长度的解决方案来解决这个问题 Schema::create('users', function (Blueprint $table) { $table->id(); $table->string
php artisan migrate:fresh
。我能够通过使用涉及指定特定字段长度的解决方案来解决这个问题
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name', 50);
$table->string('email', 100)->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password', 24);
$table->rememberToken();
$table->timestamps();
});
公认的解决方案是修改Schema::defaultStringLength()代码>
这只是个人喜好吗
编辑:我注意到文档中还有一个额外的细节
如果您运行的MySQL版本早于5.7.7版本或早于10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便MySQL为其创建索引。您可以通过在AppServiceProvider中调用Schema::defaultStringLength方法来配置此选项:
我只是碰巧使用了5.7.28版
如果您运行的MySQL版本早于5.7.7版本或早于10.2.2版本,则可能需要手动配置迁移生成的默认字符串长度,以便MySQL为其创建索引。您可以通过在AppServiceProvider中调用Schema::defaultStringLength方法来配置此选项:
我碰巧使用的是5.7.28版,正如错误指定的那样,您可以在提供程序中设置默认字符串长度,可以是AppServiceProvider.php
public function boot()
{
Schema::defaultStringLength(191);
}
为了进一步阅读,请特别查看索引每行的767字节限制
因此,有一些东西需要带走:
该问题适用于使用InnoDB存储引擎存储的表(大多数情况下为默认值)
它适用于5.7.7之前的MySQL,也适用于5.7.7之后使用不同参数(默认参数除外)的版本
数据库本身没有固有的默认长度。默认长度特别是一个Laravel特征
255个字符的默认长度意味着每个字符最多可以有2个字节,以便能够在给定字段上创建索引,因此utf8
可以,但utf8mb4
不能
如果您没有微调字段长度的选项,则建议使用Schema::defaultStringLength()
。在理想情况下,您的字段长度将根据插入其中的预期数据进行微调。这将允许您更快地捕获输入错误
所以我建议使用Schema::defaultStringLength(191)代码>如果您无法更改innodb设置,但仍然可以根据实际的预期需要微调字段长度。设置defaultStringLength只是将其从默认值255调整为您以往设置的值,您可以自己显式设置字段长度,如果您愿意,是否回答您的问题?如果你“不相信被接受的解决方案是更好的解决方案”,那么还有40个其他方案可供选择。你希望得到什么样的答案?