Error: "SQLSTATE[42000]: Syntax error or access violation: 1064

Error: "SQLSTATE[42000]: Syntax error or access violation: 1064

我遇到了 Laravel MySQL 迁移问题。

迁移:

 public function up()
{
    Schema::create('capsule_packages', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->tinyInteger('type')->unsigned();
        $table->json('data')->nullable();
        $table->decimal('price', 19, 4);
        $table->text('description')->nullable();
        $table->timestamps();
    });
}

错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'json null, price decimal(19, 4) not null, description text null, created_at' at line 1 (SQL: create tablecapsule_packages(idint unsigned not null auto_increment primary key,namevarchar(255) not null,typetinyint unsigned not null,datajson null,pricedecimal(19, 4) not null,descriptiontext null,created_attimestamp null,updated_at` timestamp null) default character set utf8 collate 'utf8_unicode_ci')

这可能是因为您的 MySQL 版本。做了一些挖掘,似乎自 Laravel 5.2 以来,$table->json() 方法将尝试在数据库中创建一个实际的 json 字段。但是,在您的示例中,json 在您当前的 MySQL 版本中不可用。您只能在 MySQL 版本 5.7.8. 及更高版本中使用此字段。如果您使用的版本低于此版本,则可以通过创建 text 字段而不是 json.

来解决此错误

您可以在错误代码中看到这一点:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near json

来源:dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-8.html#mysqld-5-7-8-json

编辑:

根据 MariaDB 版本 10.1.x 及更低版本不支持 json 数据类型

来源:github.com/laravel/framework/issues/13622