我的 Laravel 8 项目中有一个数据库表,我想将其分配给 MyISAM。我用这一行 $table->engine = "MyISAM";
在迁移文件中。当我开始 php artisan migrate
时,我收到以下错误消息:
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 `view_counters` add index
`view_counters_countable_type_countable_id_index`(`countable_type`,
`countable_id`))
那是我的迁移文件:
Schema::create('view_counters', function (Blueprint $table) {
$table->engine = "MyISAM";
$table->id();
$table->morphs('countable');
$table->integer('views')->default(0);
});
我已经读到,在这种情况下,您可以将 Schema::defaultStringLength(191)
添加到 AppServiceProvider 的 boot() 方法以避免此错误。
问题:我想知道错误消息的确切含义?也许我的 在迁移中编写数据库引擎的方法是错误的。谁知道更多?
最佳答案
该错误与字符串长度有关。默认情况下,laravel 使用 length of 255 创建字符串列使用字符集/排序规则 utf8mb4
(4 字节 UTF-8 Unicode 编码)。
只需降低 AppServiceProvider
类中的默认设置即可。 (app\Providers\AppServiceProvider.php)
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191); // I think you can use 250 or 249 instead
}
我认为您可以使用 250 (250 * 4 = 1000 <= 1000) 或 249 (249 * 4 = 996 < 1000) 而不是 191。
默认值 255 (255 * 4 = 1020 > 1000) 超出限制。
文档使用 191 的原因是因为 InnoDB 的索引限制是 767 (191 * 4 = 764 < 767)
关于laravel - 数据库引擎设置为MyISAM时的迁移问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70906948/