laravel - 数据库引擎设置为MyISAM时的迁移问题

标签 laravel

我的 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)


更多信息:8.x - Migrations - Index Lengths & MySQL / MariaDB

关于laravel - 数据库引擎设置为MyISAM时的迁移问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70906948/

相关文章:

php - Eloquent Laravel 展示试图获取非对象的属性 'code'

laravel - 在 Laravel 数组名称中验证

php - Apache、PHP、MySQL、PDO、权限被拒绝、laravel

php - 在PHP(Laravel)中将Json重新格式化为geoJson

Javascript 复选框将另一个表中的值添加到价格中

javascript - Chrome 不适用于 vuejs v-on :click in option tag

php - 拉维尔 "No scheduled commands are ready to run."

php - 使用ajax和laravel实时验证电子邮件(如果电子邮件已在数据库中,则显示电子邮件已被占用),就像gmail注册页面一样

php - laravel - php artisan 迁移失败

javascript - 为什么在这两种情况下都删除了条目?